rails 3.1.0 ActionView :: Template :: Error (application.css tidak dikompilasi)


281

Saya membuat aplikasi rel dasar dengan pengontrol halaman sederhana dengan fungsi indeks dan ketika saya memuat halaman yang saya dapatkan:

ActionView::Template::Error (application.css isn't precompiled):
    2: <html>
    3: <head>
    4:   <title>Demo</title>
    5:   <%= stylesheet_link_tag    "application" %>
    6:   <%= javascript_include_tag "application" %>
    7:   <%= csrf_meta_tags %>
    8: </head>
  app/views/layouts/application.html.erb:5:in `_app_views_layouts_application_html_erb__43625033_88530400'

Gemfile

source 'http://rubygems.org'

gem 'rails', '3.1.0'

# Bundle edge Rails instead:
# gem 'rails',     :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'

gem 'execjs'
gem 'therubyracer'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', "  ~> 3.1.0"
  gem 'coffee-rails', "~> 3.1.0"
  gem 'uglifier'
end

gem 'jquery-rails'

# Use unicorn as the web server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end

7
bundel exec rake aset: precompile tampaknya memperbaikinya, tetapi mengapa itu tidak bekerja?
Chris Muench

10
Saya memiliki masalah yang sama dalam produksi, bahkan setelah menjalankan bundle exec rake aset: precompile
Lucas Renan

Jawaban:


313

Secara default Rails mengasumsikan bahwa Anda memiliki file Anda dikompilasi di lingkungan produksi, jika Anda ingin menggunakan kompilasi langsung (kompilasi aset Anda selama runtime) dalam produksi Anda harus mengatur config.assets.compile menjadi true .

# config/environments/production.rb
...
config.assets.compile = true
...

Anda dapat menggunakan opsi ini untuk mundur ke Sprocket ketika Anda menggunakan aset yang telah dikompilasi tetapi ada file yang belum dikompilasi yang hilang.

Jika config.assets.compileopsi disetel ke false dan ada file prekompilasi yang hilang, Anda akan mendapatkan "AssetNoPrecompiledError" yang menunjukkan nama file yang hilang.


3
Anda mungkin ingin mencoba apa yang dikatakan artikel ini: devcenter.heroku.com/articles/rails31_heroku_cedar (Saya belum mencobanya sendiri)
Chris Muench

7
Supaya jelas, opsi config.assets.compile ada di config / environment / production.rb (jika Anda bekerja di bagian produksi). Dan jika Anda ingin dapat melakukan kompilasi langsung / malas dalam produksi, Anda juga perlu mengaktifkan kompilasi malas di application.rb.
Berlangsung

34
Mengaktifkan kompilasi runtime bukan solusinya, karena performa yang kita ambil bagus. Solusinya adalah memperbaiki masalah inti yang mencegah pra-kompilasi aset terjadi.
David Tuite

5
Saya mengkompilasi aset menggunakan RAILS_ENV = bundel produksi rake aset: precompile. Mengapa saya mendapatkan kesalahan ini dan perlu mengatur bendera ini juga?
Tony

2
@ Tony, karena Anda mungkin meminta sesuatu selain file application.css / js / image, dan Anda tidak mendaftarkannya application.rb. Tambahkan ke / mengedit application.rb: config.assets.precompile += %w( first.css second.js ). Sekarang file-file ini akan dikompilasi juga. Jangan menambahkan semua file jika Anda menggunakannya hanya dalam sprocket require, tetapi hanya jika Anda memasukkannya dengan <link>/<script>
elado

202

Anda akan mendapatkan kinerja yang lebih baik dalam produksi jika Anda menetapkan config.assets.compile ke false dalam production.rb dan prakompilasi aset Anda. Anda bisa mengkompilasi dengan tugas menyapu ini:

bundle exec rake assets:precompile

Jika Anda menggunakan Capistrano, versi 2.8.0 memiliki resep untuk menangani hal ini pada waktu penggunaan. Untuk info lebih lanjut, lihat bagian "Dalam Produksi" dari Panduan Pipa Aset: http://guides.rubyonrails.org/asset_pipeline.html


14
Saya tidak percaya betapa sulitnya mengetahui cara melakukan ini.
derekerdmann

3
Ini sepertinya pilihan yang jelas lebih baik: mengatur kompilasi langsung ke true "menggunakan lebih banyak memori, berkinerja lebih buruk daripada default dan tidak direkomendasikan." guides.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell

rake -Tatau bundle exec rake -Ttemanmu.
Ryan

2
@Underworld Bundler adalah alat untuk mengelola dependensi permata di aplikasi ruby ​​dan dibangun ke dalam Rails 3. Jika Anda menggunakan bundler, menjalankan bundle exec rake ...akan memastikan bahwa Anda memuat rake yang tepat dan dependensi terkait untuk aplikasi Anda. Jika Anda tidak menggunakan bundler, jalankan saja rake ....
richardsun

3
Jika Anda akan menjalankan perintah di atas, pastikan bahwa Anda sudah mengatur lingkungan Anda ke mode produksi, atau awali perintah dengan RAILS_ENV = produksi
JESii

31

OK - saya punya masalah yang sama. Saya tidak ingin menggunakan "config.assets.compile = true" - Saya harus menambahkan semua file .css saya ke daftar di config / environment / production.rb:

config.assets.precompile += %w( carts.css )

Kemudian saya harus membuat (dan kemudian menghapus) tmp / restart.txt

Saya secara konsisten menggunakan helper stylesheet_link_tag, jadi saya menemukan semua file css tambahan yang perlu saya tambahkan:

find . \( -type f -o -type l \) -exec grep stylesheet_link_tag {} /dev/null \;

Jika Anda menggunakan kueri media dan file css berbeda untuk resolusi berbeda, ini adalah cara terbaik untuk melakukannya.
Fa11enAngel

1
Saya harus memasukkan semua file css saya ke dalam array? Bagaimana jika saya memiliki file 40 css?
yozzz

30

Perbaikan cepat untuk pengguna capistrano adalah dengan menempatkan baris ini ke Capfile

# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'

11

Untuk semua orang yang membaca ini tetapi tidak memiliki masalah dengan application.cssdan bukannya dengan kelas CSS kustom mereka misalnya admin.css,base.css dll.

Solusi adalah menggunakan sebagaimana disebutkan

bundle exec rake assets:precompile

Dan dalam referensi stylesheet referensi saja application.css

<%= stylesheet_link_tag    "application", :media => "all" %>

Karena pipeline aset akan mengkompilasi semua stylesheet Anda di application.css. Ini juga terjadi dalam pengembangan sehingga menggunakan referensi lain yang salah ketika menggunakan pipa aset.


8

Saya mengalami kesalahan yang sama persis di lingkungan pengembangan saya. Pada akhirnya yang perlu saya lakukan untuk memperbaikinya adalah menambahkan:

config.assets.manifest = Rails.root.join("public/assets")

ke file config / environment / development.rb saya dan memperbaikinya. Konfigurasi terakhir saya dalam pengembangan terkait dengan aset terlihat seperti:

config.assets.compress = false  
config.assets.precompile += %w[bootstrap-alerts.js] #Lots of other space separated files
config.assets.compile = false
config.assets.digest = true
config.assets.manifest = Rails.root.join("public/assets")
config.assets.debug = true

Ini adalah satu-satunya solusi yang berhasil untuk saya. Mungkin itu masalah dengan versi Rails saya (3.1.3)? Lagi pula, saya bisa tahu aset saya telah berhasil dikompilasi ke publik / aset dan nama file mereka memiliki SHA yang sama seperti yang tercantum dalam manifest.yml. Untuk beberapa alasan, Rails tidak lagi mencari aset di tempat yang tepat, meskipun pengaturan saya selalu berfungsi dengan baik sebelumnya. Perubahan ini memperbaiki itu.
Antinome

Terima kasih atas solusi ini. Saya mencoba untuk menguji beberapa hal dalam mode pengembangan dan saya terkejut bahwa itu mengatakan "application.css tidak dikompilasi" meskipun saya sudah mengkompilasi aset dan publik / aset / application.css ada dalam direktori. Terkejut mereka tidak menetapkan config.assets.manifestasi untuk Anda secara otomatis dalam pengembangan seperti yang mereka lakukan dalam produksi ..
Tyler Rick

5

Saya juga memiliki masalah ini, di mana mencoba untuk menjalankan produksi tanpa mengkompilasi ulang masih akan membuang kesalahan yang tidak dikompilasi. Saya harus mengubah baris mana yang dikomentari application.rb:

  # If you precompile assets before deploying to production, use this line
  # Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  Bundler.require(:default, :assets, Rails.env)

2
Hanya ingin mengklarifikasi bagi siapa pun yang menemukan ini nanti, kode yang perlu Anda ubah di atas terletak diconfig/application.rb
GMA

4

Inilah perbaikan cepat:

Jika Anda menggunakan capistrano, lakukan ini tambahkan ini ke deploy.rb Anda:

after 'deploy:update_code' do
  run "cd #{release_path}; RAILS_ENV=production rake assets:precompile"
end

tutup penyebaran


2

Saya mengalami pesan kesalahan ini hari ini dan ingin memposting resolusi untuk kasus saya. Ternyata masalah saya adalah bahwa salah satu file css saya tidak memiliki kurung penutup dan ini menyebabkan file tersebut tidak dapat dikompilasi. Mungkin lebih sulit untuk memperhatikan ini jika Anda memiliki proses otomatis yang mengatur semuanya (termasuk precompile aset) untuk lingkungan produksi Anda.


1

Lagi pula gagal ...

Solusi saya adalah mengubah file layout dari

= stylesheet_link_tag "reset-min", 'application'

untuk

= stylesheet_link_tag 'application'

Dan itu berhasil! (Anda dapat meletakkan file atur ulang di dalam manifes.)


1

Hanya cara lain untuk memperbaiki ini pada Heroku: Pastikan Rakefile Anda berkomitmen dan didorong.


0

Pada server heroku (readonly filesystem), Jika Anda ingin kompilasi runtime css (tidak disarankan tetapi Anda dapat melakukannya), pastikan Anda telah melakukan pengaturan seperti di bawah ini -

# inside config/application.rb
config.assets.enabled = true
config.assets.prefix = Rails.root.join('tmp/assets').to_s

# If you are using sass then keep gem outside of asset group
 gem 'sass-rails',   '3.1.4'

# inside config/environments/production.rb
config.assets.compile = true

0

jika Anda berpikir Anda mengikuti semuanya dengan baik tetapi masih sial, pastikan Anda / capistrano menjalankan touch tmp / restart.txt atau setara di akhir. Saya berada di daftar sial tapi sekarang :)


0

Anda mungkin memiliki syntax errorcss yang Anda gunakan.

Jalankan perintah ini

$ bundle exec rake assets:precompile RAILS_ENV=development --trace

Ini akan memberikan pengecualian, memperbaikinya dan Anda semua selesai.

Terima kasih

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.