【问题标题】:rails 4 asset pipeline assets.rb refactor issuerails 4 资产管道 assets.rb 重构问题
【发布时间】:2026-02-10 22:25:02
【问题描述】:

资产被过滤掉并且不会被提供:添加 Rails.application.config.assets.precompile += %w( home.css )config/initializers/assets.rb 并重启你的服务器

我正在尝试设置多种布局,这些布局针对不同的 .css.scss 和 .js 设置,一种用于主页,另一种用于应用程序的各个部分。

我的家庭布局如下:

doctype html
= render 'layouts/components/view_source_msg'
html
  head
    title
      = browser_title(yield(:title))
    = render 'layouts/components/meta'
    = render 'layouts/components/favicons'
    = stylesheet_link_tag 'home'
    = csrf_meta_tags

  body[class="#{build_body_class} loading"]

    == yield
    = render 'layouts/components/analytics'
    = javascript_include_tag 'home'

    javascript:
      $(function(){
        $(document).foundation();
        view_#{controller.controller_name.downcase}.init();
      });

设置初始化程序 assets.rb 的错误状态,我将其设置为:

Rails.application.config.assets.precompile += %w( *.css.sass )
Rails.application.config.assets.precompile += %w( *.css.scss )
Rails.application.config.assets.precompile += %w( *.js )
Rails.application.config.assets.precompile += %w( *.js.coffee )
Rails.application.config.assets.precompile += %w( *.js.coffee.erb )

但这不起作用...谁能指出我正确的方向?谢谢你

更新

我能够通过...完成这项工作

Rails.application.config.assets.precompile += %w( home.css )
Rails.application.config.assets.precompile += %w( home.js )

但这似乎有点不对劲。在我的旧 Rails 应用程序中,其他方法可以正常工作......

【问题讨论】:

  • 我对您的语法感到困惑。我只是使用了一个工作应用程序,添加了一个新的 test.css 文件,并使用 stylesheet_link_tag 方法从布局中引用它,并且在没有您所做的修复的情况下,rails 使用它没有问题(我只是让它将所有文本更改为红色表示它有效)。这是一个愚蠢的问题,但您确实在您的app/assets/stylesheets 文件夹中放置了一个home.css 文件,对吧?
  • @RobW。是的,我做到了,但它实际上是在 home.css.scss 文件中。并不是说 sass 扩展很重要,但我更关心为什么通配符不起作用。我知道我在这里遗漏了一些小东西。

标签: ruby-on-rails ruby asset-pipeline


【解决方案1】:

从 Rails v4 开始,sprockets gem 现在可以处理资产管道。它会在app/assets/stylesheetsvendor/assets/stylesheets 文件夹中查找样式表文件,因此如果您将home.css 放入public/assets/stylesheets 或其他内容中,它不会在那里查找。如果您明确告诉 rails 预编译任何匹配该名称的资产,就像您在修复中所做的那样,它会这样做,然后输出编译的样式表并知道要引用它,这就是它起作用的原因。然而,这不是首选的约定。 Ruby API for Coding Links to Assets

【讨论】:

  • 并确保您的application.css 文件包含以下行:` *= require_self` ` *= require_tree .`
  • 该文件位于 app/assets/stylesheets 目录中,我确保 *= require_self 并且我仍然必须使用 Rails.application.config.assets.precompile += %w( home. css ) 在初始化程序中。如果您只需要*文件,是否需要 *= require_tree?
  • 嗯,这真的让我摸不着头脑。什么版本的 Rails?是的,即使是*文件也需要它,因为 sprockets 管道会查看 application.css 和 application.js 以确定它需要哪些资产。 Ruby API on manifest files and directives
  • 这是 rails 4.1,我发现 rails 不寻找默认文件。 jaketrent.com/post/rename-files-in-asset-pipeline 因此,如果您想将 = stylesheet_link_tag 'home' 用于主布局,将 = stylesheet_link_tag 'application' 用于其他布局,则必须将其添加到 assets.rb 初始化程序中。
  • 有趣...我猜因为您从未在该布局中引用 application.css,它不会打扰预编译它,因此也永远不会编译 home.css。好吧,无论如何,猜你回答了你自己的问题!