ราง 3.1.0 ActionView :: Template :: ข้อผิดพลาด (application.css ไม่ได้ถูกคอมไพล์ล่วงหน้า)


281

ฉันได้สร้างแอพพลิเคชั่นพื้นฐานพร้อมตัวควบคุมหน้าอย่างง่ายพร้อมฟังก์ชั่นดัชนีและเมื่อฉันโหลดหน้าฉันได้รับ:

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
มัดสินทรัพย์ rake exec: precompile ดูเหมือนจะแก้ไขได้ แต่ทำไมมันไม่ทำงาน?
Chris Muench

10
ฉันมีปัญหาเดียวกันในการผลิตแม้หลังจากเรียกใช้สินทรัพย์ rake bundle rake: precompile
Lucas Renan

คำตอบ:


313

โดยค่าเริ่มต้น Rails อนุมานว่าคุณมีไฟล์ของคุณ precompiled ในสภาพแวดล้อมการผลิตถ้าคุณต้องการใช้การรวบรวมสด (รวบรวมทรัพย์สินของคุณในช่วงรันไทม์) ในการผลิตคุณต้องตั้งค่าconfig.assets.compile จริง

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

คุณสามารถใช้ตัวเลือกนี้เพื่อย้อนกลับไปที่เฟืองเมื่อคุณใช้สินทรัพย์ที่คอมไพล์แล้ว แต่มีไฟล์ที่คอมไพล์แล้วขาดหายไป

หากconfig.assets.compileตั้งค่าตัวเลือกเป็นเท็จและไม่มีไฟล์ที่คอมไพล์แล้วคุณจะได้รับ "AssetNoPrecompiledError" เพื่อระบุชื่อของไฟล์ที่หายไป


3
คุณอาจต้องการลองสิ่งที่บทความนี้พูดถึง: devcenter.heroku.com/articles/rails31_heroku_cedar (ฉันยังไม่ได้ลองด้วยตัวเอง)
Chris Muench

7
เพื่อให้ชัดเจนตัวเลือก config.assets.compile อยู่ใน config / environment / production.rb (ถ้าคุณกำลังทำงานในการผลิต) และถ้าคุณต้องการที่จะสามารถทำคอมไพล์สด / ขี้เกียจในการผลิตคุณยังต้องเปิดใช้งานการรวบรวมขี้เกียจใน application.rb
avioing

34
การเปิดใช้งานการรวบรวมรันไทม์ไม่ใช่วิธีการแก้ปัญหาเนื่องจากประสิทธิภาพที่เราใช้ การแก้ปัญหาคือการแก้ไขปัญหาหลักที่ป้องกันไม่ให้เกิดการรวบรวมสินทรัพย์ล่วงหน้า
David Tuite

5
ฉันทำการคอมไพล์สินทรัพย์โดยใช้ RAILS_ENV = ชุดการผลิตสินทรัพย์เรคการทำบัญชี: เตรียมคอมไพล์ เหตุใดฉันจึงได้รับข้อผิดพลาดนี้และจำเป็นต้องตั้งค่าสถานะนี้ด้วย
Tony

2
@Tony เพราะคุณอาจถามหาสิ่งอื่นที่ไม่ใช่ไฟล์ application.css / js / application.rbภาพและคุณไม่ได้ลงทะเบียนไว้ใน เพื่อเพิ่ม / แก้ไข:application.rb config.assets.precompile += %w( first.css second.js )ตอนนี้ไฟล์เหล่านี้จะรวบรวมเช่นกัน อย่าเพิ่มไฟล์ทั้งหมดถ้าคุณใช้มันในเฟืองrequireเท่านั้น แต่ถ้าคุณรวมมันด้วย<link>/<script>
elado

202

คุณจะได้รับประสิทธิภาพที่ดีขึ้นในการผลิตถ้าคุณตั้งค่า config.assets.compile เป็น false ใน production.rb และคอมไพล์สินทรัพย์ของคุณ คุณสามารถคอมไพล์ด้วยงาน rake นี้:

bundle exec rake assets:precompile

หากคุณกำลังใช้ Capistrano เวอร์ชัน 2.8.0 มีสูตรเพื่อจัดการกับสิ่งนี้ในเวลาที่ใช้งาน สำหรับข้อมูลเพิ่มเติมโปรดดูส่วน "กำลังการผลิต" ของคู่มือการวางแนวของสินทรัพย์: http://guides.rubyonrails.org/asset_pipeline.html


14
ฉันไม่อยากจะเชื่อเลยว่ามันยากแค่ไหนที่จะรู้ว่าต้องทำอย่างไร
derekerdmann

3
ดูเหมือนว่าตัวเลือกที่ดีกว่าอย่างชัดเจน: การตั้งค่าการคอมไพล์สดเป็นจริง "ใช้หน่วยความจำมากขึ้นทำงานได้ไม่ดีกว่าค่าเริ่มต้นและไม่แนะนำ" guide.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell

rake -Tหรือbundle exec rake -Tเป็นเพื่อนของคุณ
Ryan

2
@ Underworld Bundler เป็นเครื่องมือสำหรับจัดการการพึ่งพาพลอยในแอพ ruby ​​และมันถูกสร้างขึ้นใน Rails 3. หากคุณใช้ Bundler การรันbundle exec rake ...จะช่วยให้มั่นใจได้ว่าคุณกำลังโหลดคราดที่ถูกต้องและการพึ่งพาที่เกี่ยวข้องสำหรับแอปของคุณ หากคุณไม่ได้ใช้ Bundler rake ...คุณก็จะทำงาน
richardsun

3
หากคุณกำลังจะเรียกใช้คำสั่งข้างต้นตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าสภาพแวดล้อมของคุณเป็นโหมดการผลิตหรือคำนำหน้าคำสั่งด้วย RAILS_ENV = การผลิต
JESii

31

ตกลง - ฉันมีปัญหาเดียวกัน ฉันไม่ต้องการใช้ "config.assets.compile = true" - ฉันต้องเพิ่มไฟล์. css ทั้งหมดของฉันไปยังรายการใน config / environment / production.rb:

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

จากนั้นฉันต้องสร้าง (และลบภายหลัง) tmp / restart.txt

ฉันใช้เครื่องมือช่วยเหลือ stylesheet_link_tag อย่างสม่ำเสมอดังนั้นฉันจึงพบไฟล์ css ทั้งหมดที่ฉันต้องการเพิ่มด้วย:

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

หากคุณใช้การสืบค้นสื่อและไฟล์ css ที่แตกต่างกันสำหรับการแก้ปัญหาที่แตกต่างกันนี่เป็นวิธีที่ดีที่สุด
Fa11enAngel

1
ฉันต้องรวมไฟล์ css ทั้งหมดในอาร์เรย์ ถ้าฉันมีไฟล์ css 40 ไฟล์ล่ะ
yozzz

30

การแก้ไขด่วนสำหรับผู้ใช้ capistrano คือการวางบรรทัดนี้ใน Capfile

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

11

สำหรับผู้ที่กำลังอ่านนี้ แต่ไม่ได้มีปัญหากับapplication.cssและแทนที่จะกับการเรียน CSS ที่กำหนดเองของพวกเขาเช่นadmin.css, base.cssฯลฯ

วิธีแก้ไขคือใช้ตามที่กล่าวไว้

bundle exec rake assets:precompile

และในการอ้างอิงสไตล์ชีทเพียงแค่อ้างอิง application.css

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

เนื่องจากไปป์ไลน์ของสินทรัพย์จะคอมไพล์สไตล์ชีตของคุณทั้งหมดใน application.css สิ่งนี้ยังเกิดขึ้นในการพัฒนาดังนั้นการใช้การอ้างอิงอื่น ๆ จะผิดเมื่อใช้ไพพ์ไลน์ของสินทรัพย์


8

ฉันมีข้อผิดพลาดเดียวกันในสภาพแวดล้อมการพัฒนาของฉัน ในที่สุดสิ่งที่ฉันต้องทำเพื่อแก้ไขมันคือการเพิ่ม:

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

ไปยังไฟล์ config / environment / development.rb ของฉันและแก้ไข การกำหนดค่าสุดท้ายของฉันในการพัฒนาที่เกี่ยวข้องกับเนื้อหาดูเหมือนว่า:

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

นี่เป็นทางออกเดียวที่ได้ผลสำหรับฉัน อาจเป็นปัญหากับ Rails รุ่นของฉัน (3.1.3) อย่างไรก็ตามฉันสามารถบอกได้ว่าสินทรัพย์ของฉันได้รับการคอมไพล์ให้กับสาธารณะ / สินทรัพย์เรียบร้อยแล้วและชื่อไฟล์ของพวกเขามี SHA เช่นเดียวกับที่ระบุในรายการ ด้วยเหตุผลบางอย่าง Rails ไม่ได้มองหาสินทรัพย์ในสถานที่ที่เหมาะสมอีกต่อไปแม้ว่าการติดตั้งของฉันจะทำงานได้ดีก่อนหน้านี้ การเปลี่ยนแปลงนี้ได้แก้ไขว่า
antinome

ขอบคุณสำหรับการแก้ปัญหานี้ ฉันพยายามทดสอบบางสิ่งในโหมดการพัฒนาและฉันรู้สึกประหลาดใจที่มีข้อความว่า "application.css ไม่ได้ถูกคอมไพล์ล่วงหน้า" แม้ว่าฉันจะมีการคอมไพล์แล้วและสาธารณะ / สินทรัพย์ / application.css อยู่ในไดเรกทอรี ประหลาดใจที่พวกเขาทำไม่ได้ตั้ง config.assets.manifest ให้คุณโดยอัตโนมัติในการพัฒนาเช่นที่พวกเขาทำในการผลิต ..
ไทเลอร์ริก

5

ฉันยังมีปัญหานี้ซึ่งพยายามที่จะทำงานในการผลิตโดยไม่ต้อง precompiling มันจะยังคงโยนข้อผิดพลาดที่ไม่ได้เตรียมไว้ ฉันต้องเปลี่ยนแอปพลิเคชันที่แสดงความคิดเห็นบรรทัดใด: 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
เพียงแค่ต้องการอธิบายให้ชัดเจนสำหรับทุกคนที่เจอสิ่งนี้ในภายหลังรหัสที่คุณต้องเปลี่ยนข้างต้นตั้งอยู่ในconfig/application.rb
GMA

4

นี่คือการแก้ไขด่วน:

หากคุณใช้ capistrano ให้เพิ่มสิ่งนี้ใน deploy.rb ของคุณ:

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

หมวกปรับใช้


2

ฉันพบข้อความแสดงข้อผิดพลาดในวันนี้และต้องการโพสต์ความละเอียดให้กับเคสของฉัน ปรากฎว่าปัญหาของฉันคือไฟล์ css หนึ่งไฟล์ของฉันไม่มีวงเล็บปิดปิดและนี่ทำให้ไฟล์ไม่ถูกคอมไพล์ อาจสังเกตเห็นได้ยากถ้าคุณมีกระบวนการอัตโนมัติที่ตั้งค่าทุกอย่าง (รวมถึงการรวบรวมสินทรัพย์ล่วงหน้า) สำหรับสภาพแวดล้อมการผลิตของคุณ


1

หลังจากทั้งหมดล้มเหลว ...

ทางออกของฉันคือการเปลี่ยนไฟล์เค้าโครงจาก

= stylesheet_link_tag "reset-min", 'application'

ถึง

= stylesheet_link_tag 'application'

และมันก็ใช้งานได้! (คุณสามารถวางไฟล์รีเซ็ตภายในไฟล์ Manifest)


1

อีกวิธีในการแก้ไขปัญหานี้ใน Heroku: ตรวจสอบให้แน่ใจว่า Rakefile ของคุณมุ่งมั่นและผลักดันแล้ว


0

บนเซิร์ฟเวอร์ heroku (ระบบไฟล์แบบอ่านอย่างเดียว), หากคุณต้องการคอมไพล์รันไทม์ของ css (ไม่แนะนำ แต่คุณสามารถทำได้), ตรวจสอบให้แน่ใจว่าคุณได้ทำการตั้งค่าดังนี้ -

# 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

หากคุณคิดว่าคุณทำตามทุกอย่างได้ดี แต่ก็ยังโชคไม่ดีให้แน่ใจว่าคุณ / capistrano เรียกใช้ touch tmp / restart.txt หรือเทียบเท่าในตอนท้าย ฉันอยู่ในรายการที่โชคร้าย แต่ตอนนี้ :)


0

คุณอาจมีsyntax errorใน CSS ที่คุณใช้

เรียกใช้คำสั่งนี้

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

มันจะให้ข้อยกเว้นคงที่และคุณทำเสร็จแล้ว

ขอบคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.