Pertanyaan javascript_include_tag Rails 4 menghasilkan “/ javascripts /” alih-alih “/ assets” dalam produksi


Saya memiliki aplikasi Rails 4 dengan

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>

di kepala. Dalam pengembangan, HTML berikut ini dirender, dan modernizr dimuat:

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>

Dalam produksi, HTML berikut diberikan, dan modernizr adalah tidak dimuat (404 tidak ditemukan):

<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script>

Dalam produksi, /assets/modernizr.js ditemukan dan dapat dijelajahi.

Itu Dokumentasi rel mengatakan bahwa javascript_include_tag harus menghasilkan

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>

Dalam produksi, saya stylesheet_link_tags baik-baik saja, menghubungkan ke /assets/ direktori.

Kenapa itu javascript_include_tag menautkan ke /javascripts dari pada /assets dalam produksi, dan bagaimana cara memperbaikinya?


32
2017-07-12 19:43


asal


Jawaban:


Salah satu pernyataan penggunaan untuk AssetUrlHelper menunjukkan akan menghasilkan / javascripts / url seperti apa yang Anda lihat:

# asset_path "application", ketik:: javascript # => /javascripts/application.js

(from asset_url_helper.rb line 117 - [1])

Kode ini terlihat seperti itu hanya dapat dicapai jika aset dikompilasi hilang sehingga tampaknya kompilasi aset Anda tidak berfungsi (biasanya saya gunakan gagal ketika itu terjadi, jadi mungkin Anda bahkan tidak menembak).

Aset_url_helper.rb yang sama memanggil / javascripts / part 'extname' dan menggunakan peta berikut untuk mengetahui cara menghasilkan nama:

 # Maps asset types to public directory.
  ASSET_PUBLIC_DIRECTORIES = {
    audio:      '/audios',
    font:       '/fonts',
    image:      '/images',
    javascript: '/javascripts',
    stylesheet: '/stylesheets',
    video:      '/videos'
  }

Aplikasi Rails 4 baru memiliki ini di config / environment / production.rb

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

yang tampaknya sesuai dengan perilaku yang Anda lihat.


21
2017-10-06 23:17



Secara default, Rails hanya precompiles application.js, application.css dan gambar apa pun yang ditemukan di jalur aset. Oleh karena itu, dalam mordernizr produksi tidak akan dikompilasi dan dengan demikian javascript pembantu tidak akan dapat menemukan file.

Untuk memperbaiki masalah, Anda dapat menambahkan modernizr ke daftar precompile dengan memodifikasi konfigurasi berikut production.rb

config.assets.precompile += ['modernizr.js']

Untuk informasi lebih lanjut, lihat Panduan Rails


12
2018-02-11 01:36



Pastikan untuk mengkompilasi aset Anda dalam produksi dengan menjalankan perintah ini:

RAILS_ENV=production bundle exec rake assets:precompile

Panduan Rails pada pipeline aset dapat memberi Anda lebih banyak detail: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets


4
2017-08-06 19:32



Saya memiliki aplikasi baru menggunakan Rails 4 yang disebarkan di Heroku dengan:

<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

aplikasi javascript saya. (sidik jari) .js dipanggil dari src: assets / application.js

Saya pikir masalah Anda berasal dari sesuatu ke dalam production.rb Anda yang mendefinisikan aset dari lokasi lain.

Jadi mungkin Anda dapat menambahkan Moderniz.js ke

config.assets.precompile = ['.js ','.css ',' * .css.erb ']

di config / production.rb

Atau hanya membutuhkan skrip modernizr ke application.js Anda

// = membutuhkan mordernizr

dan hapus panggilan skrip modernisasi ke tata letak Anda.

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>

Dapatkah Anda memeriksa dari mana application.js Anda dilayani ke dalam lingkungan produksi Anda?


1
2017-10-01 12:51



Mungkin karena file ini harus di / vendor / aset / javascript sebagai ganti / app / assets / javascript. Folder Vendor adalah untuk pustaka javascript, dan folder Aplikasi untuk kode Anda.

Solusi yang lebih baik daripada menambahkan tag ke tata letak Anda akan menambahkan referensi skrip ke application.js Anda dan membiarkan kompilator compass kompas dan melampirkannya ke file javascript utama Anda.

Jika Anda tidak mendapatkan jawaban pasti, periksa: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization


-1
2017-08-06 18:47