svo*_*oop 3 ruby-on-rails ruby-on-rails-3 asset-pipeline
我在 Rails 3.2rc1 应用程序中拥有一些资源,以下是其中的一些:
app/
assets/
stylesheets/
application.css.scss
users.css.scss
projects.css.scss
(...)
parts/
fonts.scss
(...)
Run Code Online (Sandbox Code Playgroud)
这application.css.scss只是一个清单,其中包含以下行:
@import 'parts/fonts';
Run Code Online (Sandbox Code Playgroud)
并views/layouts/application.html.slim加载预编译的样式表:
= stylesheet_link_tag "application", media: "all"
= stylesheet_link_tag params[:controller], media: "all"
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好,对于开发来说效果很好。在生产部署期间,rake assets:precompile被调用并且它对于应用程序样式表运行良好。但是每个控制器的样式表被跳过,因此应用程序崩溃了。
为了解决这个问题,我将其添加到config/environments/production.yml:
config.assets.precompile += %w(*.css *.js)
Run Code Online (Sandbox Code Playgroud)
现在已经编译了每个控制器的样式表,但该应用程序仍然会出现以下问题:
ActionView::Template::Error (application.css isn't precompiled):
5: = stylesheet_link_tag "application", media: "all"
app/views/layouts/application.html.slim:5:in `_app_views_layouts_application_html_slim__4032169744877009540_23192340'
Run Code Online (Sandbox Code Playgroud)
但是当我查看时public/assets/,预编译的application-3218a93530ecb65582d5b345133dab49.css和压缩的双胞胎就在那里。
如果我将通配符替换为config/environments/production.yml所有每个控制器样式表的列表(换句话说:除了 之外的所有样式表application.css),一切都会像魅力一样工作:
config.assets.precompile += %w(users.css projects.css)
Run Code Online (Sandbox Code Playgroud)
应用程序样式表是否被处理了两次,从而导致预编译无法像宣传的那样工作?
我现在解决这个问题的方法如下:
files = Dir[Rails.root.join('app', 'assets', '{javascripts,stylesheets}', '**', '[^_]*.{js,css}*')]
files.map! {|file| file.sub(%r(#{Rails.root}/app/assets/(javascripts|stylesheets)/), '') }
files.map! {|file| file.sub(%r(\.(coffee|scss)), '') }
config.assets.precompile += files
Run Code Online (Sandbox Code Playgroud)
在某些时候可能会有更好的解决方案: https ://github.com/rails/rails/issues/3094
| 归档时间: |
|
| 查看次数: |
2765 次 |
| 最近记录: |