生产环境下Rails资源没有编译

4
这里是错误信息:

Processing by LandingPageController#index as HTML
  Rendered landing_page/index.html.erb within layouts/application (2.1ms)
Completed 500 Internal Server Error in 49ms

ActionView::Template::Error (landing_page.css isn't precompiled):
    12:     <![endif]-->
    13: 
    14:         <%= stylesheet_link_tag "application", :media => "all" %>
    15:         <%= stylesheet_link_tag params[:controller] %>
    16: 
    17:   </head>
    18:   <body>
  app/views/layouts/application.html.erb:15:in `_app_views_layouts_application_html_erb__3002306950342527375_29178380'

我看到它正在寻找landing_page.css文件,因为第15行的原因。我不明白的是,在生产环境中预编译这个资产的最佳方式是什么。我尝试修改/config/application.rb:

config.assets.precompile += ['landing_page.css']

这对我来说看起来不对。我需要对每个样式表都进行这样的操作,这会很麻烦。
我在application.css清单中添加了代码:
*= require landing_page

这好像不起作用。我在不修改应用程序配置文件的情况下执行此操作时会出现第一个错误。

我对如何包含这行代码感到困惑。

<%= stylesheet_link_tag params[:controller] %>

当你运行时,在你的布局中使用预编译的资源以便于生产。

bundle exec rake assets:precompile

我感觉我错过了一些简单的技巧,可以在运行rake任务时自动将自动生成的样式表和JavaScript文件添加到预编译文件列表中。

3个回答

3
require landing_page加入application.css并不会使landing_page被预编译。这意味着当application.css被预编译时,landing_page.css的内容将被包含在输出中。如果您要单独加载它们,即:
<%= stylesheet_link_tag params[:controller] %>
那么你需要将它们全部添加到需要预编译的列表中。您可以在该列表中使用通配符,因此如果这些特定于控制器的样式表都位于stylesheets/controllers中,则可以执行以下操作:
config.assets.precompile += ["controllers/*.css"]
通常,人们不会这样做。虽然为了开发的便利,事情经常以每个控制器为基础进行拆分,但所有这些都是从application.css中所需的。然后,application.css是您调用stylesheet_link_tag的唯一样式表。

我理解Frederick的回答是指任何“自定义”清单文件(使用js_include_tag params[:controller])必须包含在config.assets.precompile中。这在Rails 4中是新的吗?所以现在只有application.css、application.js会被Rails自动编译? - Luke W
Rails 3.2 对我来说一直都是这样的。 - Frederick Cheung

3

在你的 /config/environments/production.rb 文件中添加以下内容:

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

我是否需要为每个具有关联样式表的视图都这样做?例如,如果我创建一个名为pricing_page的视图,并有一个名为pricing_page.css.scss的自动生成的css文件,我是否需要再次将相同的代码添加到production.rb文件中?我觉得我会有一堆这些行来指定所有样式表。这让我感觉很不对劲 :/ - mujtaba
不是那样,只需要这样写:config.assets.precompile += %w( landing_page.css next_file.css another_file.css) - Someth Victory

0
这对我来说是个好消息,所以我想分享一下:在Rails 4中,只有application.js|css清单文件会被Rails自动编译。如果你正在使用类似的东西。
javascript_include_tag controller_name
# ex javascript_include_tag 'guitars'

显然,您需要像上面提到的那样将自定义清单(“吉他”)添加到config.assets.precompile中。我相信这是与Rails 3.2不同的变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接