रेलगाड़ी 3.1.0 एक्शन व्यू :: टेम्प्लेट :: त्रुटि (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
बंडल रेक एसेट्स: precompile इसे ठीक करने के लिए लगता है, लेकिन यह सिर्फ काम क्यों नहीं करता है?
क्रिस मुयंच

10
मैं उत्पादन में एक ही समस्या है, यहां तक ​​कि चलाने के बाद बंडल निष्पादन रेक संपत्ति: precompile
लुकास रेनन

जवाबों:


313

डिफ़ॉल्ट रूप से माना जाता है कि आपके पास आपकी फ़ाइलें उत्पादन वातावरण में पहले से मौजूद हैं, यदि आप लाइव संकलन का उपयोग करना चाहते हैं (उत्पादन के दौरान अपनी संपत्ति संकलित करें) उत्पादन में आपको config.assets.compile को सही पर सेट करना होगा ।

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

इस विकल्प का उपयोग आप Sprockets में आने के लिए कर सकते हैं जब आप पहले से तैयार की गई संपत्ति का उपयोग कर रहे हों, लेकिन कोई भी गायब हो चुकी फ़ाइलें हैं।

यदि config.assets.compileविकल्प गलत पर सेट किया गया है और अनुपलब्ध प्री-कम्पाइल की गई फाइलें हैं, तो आपको "AssetNoPrecompiledError" मिलेगी जो कि गुम हुई फ़ाइल का नाम दर्शाती है।


3
आप कोशिश कर सकते हैं कि यह लेख क्या कहता है: devcenter.heroku.com/articles/rails31_heroku_cedar (मैंने इसे स्वयं अभी तक आज़माया नहीं है)
क्रिस म्यूनेक

7
बस स्पष्ट होने के लिए, config.assets.compile विकल्प विन्यास / वातावरण / production.rb (यदि आप उत्पादन में काम कर रहे हैं) में है। और यदि आप उत्पादन में लाइव / आलसी संकलन करने में सक्षम होना चाहते हैं, तो आपको अनुप्रयोग .rb में आलसी संकलन को भी सक्षम करना होगा।
२०

34
रनटाइम संकलन को सक्रिय करना समाधान नहीं है, क्योंकि प्रदर्शन हिट हम लेते हैं। समाधान मुख्य समस्या को ठीक करना है जो परिसंपत्ति के प्रसार को होने से रोक रहा है।
डेविड टाइट

5
मैंने Rails_ENV = उत्पादन बंडल निष्पादन रेक संपत्तियों का उपयोग करके परिसंपत्तियों को पहले से तैयार कर लिया है: precompile। मुझे यह त्रुटि क्यों हो रही है और इस ध्वज को भी सेट करने की आवश्यकता है?
टोनी

2
@ क्योंकि, आप शायद application.css / js / image फाइल के अलावा कुछ और मांगते हैं, और आपने इसे पंजीकृत नहीं किया है application.rb। करने के लिए जोड़ें / संपादित करें application.rb: config.assets.precompile += %w( first.css second.js )। अब ये फाइलें भी संकलित करेंगी। यदि आप उन्हें केवल sprockets में उपयोग करते हैं, तो सभी फ़ाइलों को न जोड़ें require, लेकिन केवल तभी जब आप उन्हें <link>/<script>
elado

202

यदि आप config.assets.compile को गलत तरीके से उत्पादन में सेट करते हैं, तो आप उत्पादन में बेहतर प्रदर्शन प्राप्त करेंगे। आप इस रेक कार्य के साथ पहल कर सकते हैं:

bundle exec rake assets:precompile

यदि आप कैपिस्ट्रानो का उपयोग कर रहे हैं, तो संस्करण 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आपका दोस्त है
रेयान

2
@Underworld Bundler एक रूबी ऐप में मणि निर्भरता के प्रबंधन के लिए एक उपकरण है और इसे रेल 3 में बनाया गया है। यदि आप बंडलर का उपयोग कर रहे हैं, तो रनिंग bundle exec rake ...यह सुनिश्चित करेगी कि आप अपने ऐप के लिए सही रेक और संबंधित निर्भरता लोड कर रहे हैं। यदि आप बंडल का उपयोग नहीं कर रहे हैं, तो आप बस चलाएंगे rake ...
रिचर्ड्सन

3
यदि आप ऊपर दिए गए आदेश को चलाने जा रहे हैं, तो सुनिश्चित करें कि आप पहले से ही अपने वातावरण को उत्पादन मोड पर सेट कर रहे हैं, या
Rreens_ENV

31

ठीक है - मुझे भी यही समस्या थी। मैं "config.assets.compile = true" का उपयोग नहीं करना चाहता था - मुझे अपने सभी .css फ़ाइलों को विन्यास / वातावरण / उत्पादन में सूचीबद्ध करना था।

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

तब मुझे tmp / restart.txt बनाना (और बाद में डिलीट करना) था

मैंने लगातार स्टाइलशीट_लिंक_टैग हेल्पर का उपयोग किया, इसलिए मुझे उन सभी अतिरिक्त सीएसएस फाइलों को मिला जिन्हें मुझे जोड़ने की आवश्यकता थी:

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

यदि आप विभिन्न प्रश्नों के लिए मीडिया क्वेरी और विभिन्न सीएसएस फाइलों का उपयोग करते हैं, तो यह जाने का सबसे अच्छा तरीका है।
15:11 बजे Fa11enAngel

1
मुझे अपनी सभी सीएसएस फ़ाइलों को सरणी में शामिल करना है? अगर मेरे पास 40 सीएसएस फाइलें हैं तो क्या होगा?
yozzz

30

कैपिस्ट्रानो उपयोगकर्ता के लिए एक त्वरित फिक्स इस लाइन को कैपफाइल में डालना है

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

11

उन सभी के लिए जो इसे पढ़ रहे हैं, लेकिन application.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")

मेरे कॉन्‍फ़िगर / वातावरण / विकास .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

यह एकमात्र समाधान था जिसने मेरे लिए काम किया। शायद यह मेरे रेल के संस्करण (3.1.3) के साथ एक समस्या थी? वैसे भी, मैं बता सकता हूं कि मेरी संपत्ति सार्वजनिक रूप से / परिसंपत्तियों के लिए सफलतापूर्वक तैयार की गई थी और उनके फाइलनाम में वही SHAs थे जो मेनिफ़ेस्ट में सूचीबद्ध थे। किसी कारण से, रेल अब सही जगह पर संपत्ति की तलाश नहीं कर रही थी, भले ही मेरे सेटअप ने पहले ठीक काम किया हो। यह परिवर्तन तय है कि
एंटीइनोम जूल

इस समाधान के लिए धन्यवाद। मैं विकास मोड में कुछ चीजों का परीक्षण करने की कोशिश कर रहा था और मुझे आश्चर्य हुआ कि यह कह रहा था कि "Application.css पूर्वनिर्धारित नहीं है" हालांकि मैंने पहले से ही संपत्ति और सार्वजनिक / संपत्ति / application.css पहले से ही निर्देशिका में मौजूद था। हैरानी की बात है कि वे config.assets.manifest को आपके लिए विकास में स्वचालित रूप से सेट नहीं करते हैं जैसे वे उत्पादन में करते हैं ..
Tyler Rick

5

मेरे पास यह मुद्दा भी था, जहां पहले से तैयार किए बिना उत्पादन में चलाने की कोशिश कर रहा था, यह अभी भी नहीं-पूर्व-त्रुटियां फेंक देगा। मुझे यह बदलना पड़ा कि किस लाइन पर आवेदन किया गया था।

  # 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 का उपयोग कर रहे हैं, तो इसे अपनी तैनाती में जोड़ें।

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

टोपी तैनात


2

मैं आज इस त्रुटि संदेश में भाग गया और संकल्प को अपने विशेष मामले में पोस्ट करना चाहता था। यह पता चला है कि मेरी समस्या यह थी कि मेरी सीएसएस फाइलों में से एक बंद ब्रेस गायब थी और इससे फाइल संकलित नहीं हो रही थी। यह नोटिस करना कठिन हो सकता है यदि आपके पास एक स्वचालित प्रक्रिया है जो आपके उत्पादन वातावरण के लिए सब कुछ सेट करती है (संपत्ति precompile सहित)।


1

आखिरकार विफल ...

मेरा समाधान लेआउट फ़ाइल से बदलना था

= stylesheet_link_tag "reset-min", 'application'

सेवा

= stylesheet_link_tag 'application'

और यह काम किया! (आप रीसेट फ़ाइल को प्रकट के अंदर रख सकते हैं।)


1

Heroku पर इसे ठीक करने का दूसरा तरीका: सुनिश्चित करें कि आपका Rakefile प्रतिबद्ध है और धकेल दिया गया है।


0

उसके सर्वर पर (आसानी से फाइलसिस्टम), यदि आप सीएसएस का रनटाइम संकलन चाहते हैं (इसकी अनुशंसा नहीं की गई है लेकिन आप इसे कर सकते हैं), सुनिश्चित करें कि आपने नीचे की तरह सेटिंग्स की हैं -

# 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 रन टच tmp / restart.txt या समकक्ष अंत में। मैं अशुभ सूची में था लेकिन अब :)


0

संभवतः syntax errorआपके द्वारा उपयोग किए जा रहे सीएसएस में आपके पास एक है।

यह आदेश चलाएँ

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

यह अपवाद देगा, तय किया गया है कि और आप सभी कर रहे हैं।

धन्यवाद

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.