rails 3.1.0 ActionView :: Template :: Error (application.css không được biên dịch trước)


281

Tôi đã tạo một ứng dụng rails cơ bản với bộ điều khiển trang đơn giản với chức năng chỉ mục và khi tôi tải trang tôi nhận được:

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'

Đá quý

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
bó tài sản thực hiện rake: tiền biên dịch dường như sửa nó, nhưng tại sao nó không hoạt động?
Chris Muench

10
Tôi có cùng một vấn đề trong sản xuất, ngay cả sau khi chạy gói tài sản cào thực thi: tiền biên dịch
Lucas Renan

Câu trả lời:


313

Theo mặc định, Rails giả định rằng bạn có các tệp được biên dịch trước trong môi trường sản xuất, nếu bạn muốn sử dụng biên dịch trực tiếp (biên dịch tài sản của bạn trong thời gian chạy) trong sản xuất, bạn phải đặt config.assets.compile thành true .

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

Bạn có thể sử dụng tùy chọn này để dự phòng cho Sprockets khi bạn đang sử dụng các tài sản được biên dịch trước nhưng có bất kỳ tệp nào được biên dịch trước.

Nếu config.assets.compiletùy chọn được đặt thành false và thiếu các tệp được biên dịch trước, bạn sẽ nhận được "AssetNoPrecompiledError" cho biết tên của tệp bị thiếu.


3
Bạn có thể muốn thử những gì bài viết này nói: devcenter.heroku.com/articles/rails31_heroku_cedar (Tôi chưa thử nó lần nào)
Chris Muench

7
Để rõ ràng, tùy chọn config.assets.compile nằm trong config / môi trường / sản xuất.rb (nếu bạn đang làm việc trong sản xuất). Và nếu bạn muốn có khả năng biên dịch trực tiếp / lười biếng trong sản xuất, bạn cũng cần kích hoạt trình biên dịch lười biếng trong application.rb.
avioing

34
Kích hoạt biên dịch thời gian chạy không phải là giải pháp, vì hiệu quả đạt được chúng tôi thực hiện. Giải pháp là khắc phục vấn đề cốt lõi đang ngăn chặn việc biên dịch tài sản xảy ra.
David Tuite

5
Tôi đã biên dịch trước các tài sản bằng RAILS_ENV = gói sản xuất thực hiện rake tài sản: tiền biên dịch. Tại sao tôi nhận được lỗi này và cũng cần thiết để đặt cờ này?
Tony

2
@Tony, vì bạn có thể yêu cầu một cái gì đó ngoài tệp application.css / js / hình ảnh và bạn đã không đăng ký nó application.rb. Thêm vào / chỉnh sửa application.rb: config.assets.precompile += %w( first.css second.js ). Bây giờ các tập tin này sẽ biên dịch là tốt. Không thêm tất cả các tệp nếu bạn chỉ sử dụng chúng trong đĩa xích require, nhưng chỉ khi bạn đưa chúng vào <link>/<script>
elado

202

Bạn sẽ có hiệu suất tốt hơn trong sản xuất nếu bạn đặt config.assets.compile thành false trong sản xuất.rb và biên dịch trước tài sản của bạn. Bạn có thể biên dịch trước với tác vụ cào này:

bundle exec rake assets:precompile

Nếu bạn đang sử dụng Capistrano, phiên bản 2.8.0 có một công thức để xử lý việc này khi triển khai. Để biết thêm thông tin, hãy xem phần "Đang sản xuất" trong Hướng dẫn đường ống tài sản: http://guides.rubyonrails.org/asset_pipeline.html


14
Tôi không thể tin được việc tìm ra cách này khó đến mức nào.
derekerdmann

3
Đây có vẻ như là tùy chọn tốt hơn rõ ràng: cài đặt biên dịch trực tiếp thành true "sử dụng nhiều bộ nhớ hơn, hoạt động kém hơn so với mặc định và không được khuyến nghị." guide.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell

rake -Thoặc bundle exec rake -Tlà bạn của bạn.
Ryan

2
@Underworld Bundler là một công cụ để quản lý các phụ thuộc đá quý trong ứng dụng ruby ​​và nó được tích hợp vào Rails 3. Nếu bạn đang sử dụng bundler, việc chạy bundle exec rake ...sẽ đảm bảo rằng bạn đang tải cào đúng và các phụ thuộc liên quan cho ứng dụng của bạn. Nếu bạn không sử dụng bundler, bạn sẽ chạy rake ....
richardsun

3
Nếu bạn định chạy lệnh trên, hãy đảm bảo rằng bạn đã đặt môi trường của mình ở chế độ sản xuất hoặc tiền tố lệnh với RAILS_ENV = sản xuất
JESii

31

OK - Tôi đã có cùng một vấn đề. Tôi không muốn sử dụng "config.assets.compile = true" - Tôi đã phải thêm tất cả các tệp .css của mình vào danh sách trong config / môi trường / sản xuất.rb:

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

Sau đó, tôi phải tạo (và sau đó xóa) tmp / restart.txt

Tôi luôn sử dụng trình trợ giúp của styleheet_link_tag, vì vậy tôi tìm thấy tất cả các tệp css bổ sung mà tôi cần để thêm vào:

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

Nếu bạn sử dụng truy vấn phương tiện và các tệp css khác nhau cho các độ phân giải khác nhau, đây là cách tốt nhất để đi.
Fa11enAngel

1
Tôi phải bao gồm tất cả các tập tin css của tôi trong mảng? Nếu tôi có 40 tệp css thì sao?
yozzz

30

Cách khắc phục nhanh cho người dùng capistrano là đưa dòng này vào Capfile

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

11

Đối với tất cả những người đang đọc nhưng không có vấn đề gì application.cssvà thay vào đó với các lớp CSS tùy chỉnh của họ admin.css, base.cssv.v.

Giải pháp là sử dụng như đã đề cập

bundle exec rake assets:precompile

Và trong tài liệu tham khảo bảng định kiểu chỉ tham khảo application.css

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

Vì đường dẫn tài sản sẽ biên dịch trước tất cả các bảng định kiểu của bạn trong application.css. Điều này cũng xảy ra trong quá trình phát triển vì vậy sử dụng bất kỳ tham chiếu nào khác là sai khi sử dụng đường dẫn tài sản.


8

Tôi đã có cùng một lỗi chính xác trong môi trường phát triển của tôi. Cuối cùng, tất cả những gì tôi cần làm để khắc phục nó là thêm:

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

vào tập tin cấu hình / môi trường / Development.rb của tôi và nó đã sửa nó. Cấu hình cuối cùng của tôi trong phát triển liên quan đến tài sản trông như:

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

Đây là giải pháp duy nhất hiệu quả với tôi. Có lẽ đó là một vấn đề với phiên bản Rails của tôi (3.1.3)? Dù sao, tôi có thể nói rằng tài sản của tôi đã được biên dịch thành công thành tài sản / tài sản và tên tệp của chúng có cùng SHA như được liệt kê trong manifest.yml. Vì một số lý do, Rails không còn tìm kiếm tài sản ở đúng nơi, mặc dù thiết lập của tôi luôn hoạt động tốt trước đây. Sự thay đổi này đã khắc phục điều đó.
antinome

Cảm ơn giải pháp này. Tôi đã thử kiểm tra một số thứ trong chế độ phát triển và tôi đã ngạc nhiên khi nó nói rằng "application.css không được biên dịch trước" mặc dù tôi đã biên dịch sẵn tài sản và công khai / tài sản / application.css có trong thư mục. Ngạc nhiên là họ không tự động đặt config.assets.manifest cho bạn trong quá trình phát triển giống như họ sản xuất ..
Tyler Rick

5

Tôi cũng gặp vấn đề này, khi cố gắng chạy trong sản xuất mà không biên dịch trước, nó vẫn sẽ ném các lỗi không được biên dịch trước. Tôi đã phải thay đổi dòng nào đã được nhận xét ứng dụng.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
Chỉ muốn làm rõ cho bất kỳ ai gặp phải điều này sau, mã bạn cần thay đổi ở trên nằm ởconfig/application.rb
GMA

4

Đây là cách khắc phục nhanh:

Nếu bạn đang sử dụng capistrano, hãy thêm phần này vào triển khai của bạn.rb:

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

mũ triển khai


2

Tôi đã gặp phải thông báo lỗi này ngày hôm nay và muốn gửi giải pháp cho trường hợp cụ thể của tôi. Hóa ra vấn đề của tôi là một trong những tệp css của tôi bị thiếu một dấu ngoặc nhọn và điều này khiến cho tệp không được biên dịch. Có thể khó nhận thấy điều này hơn nếu bạn có một quy trình tự động thiết lập mọi thứ (bao gồm cả tiền biên dịch tài sản) cho môi trường sản xuất của bạn.


1

Sau khi thất bại ...

Giải pháp của tôi là thay đổi tập tin bố trí từ

= stylesheet_link_tag "reset-min", 'application'

đến

= stylesheet_link_tag 'application'

Va no đa hoạt động! (Bạn có thể đặt tệp đặt lại bên trong tệp kê khai.)


1

Chỉ là một cách khác để khắc phục điều này trên Heroku: Đảm bảo Rakefile của bạn được cam kết và đẩy.


0

Trên máy chủ heroku (hệ thống tập tin chỉ đọc), Nếu bạn muốn biên dịch thời gian chạy của css (không khuyến nghị nhưng bạn có thể làm điều đó), hãy đảm bảo bạn đã thực hiện các cài đặt như bên dưới -

# 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

nếu bạn nghĩ rằng bạn đã làm tốt mọi thứ nhưng vẫn không may mắn, chỉ cần đảm bảo rằng bạn / capistrano chạy touch tmp / restart.txt hoặc tương đương ở cuối. Tôi đã ở trong danh sách không may mắn nhưng bây giờ :)


0

Bạn có thể có một syntax errorcss bạn đang sử dụng.

Chạy lệnh này

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

Nó sẽ đưa ra ngoại lệ, cố định điều đó và bạn đã hoàn tất.

Cảm ơn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.