【问题标题】:How to include action specific CSS or JS in Rails 3.2?如何在 Rails 3.2 中包含特定于动作的 CSS 或 JS?
【发布时间】:2012-12-09 10:48:55
【问题描述】:
我使用 Rails 3.2.9 和 twitter-bootstrap-rails gem 构建了一个网站。
我了解 Rails 资产管道将所有 CSS 合并到一个文件中。但是,我想知道修改这种行为有多容易(不确定这是否是个好主意)。
假设我有一个 Site 控制器,它有两个动作:home 和 contact_us,并且有以下 CSS:
-
site.css.scss - 应该在Site控制器的每一个动作中加载
-
home.css.scss - 只能在 home 的 Site 控制器操作中加载
-
contact_us.css.scss - 只能在Site 控制器的contact_us 操作中加载
您将如何实现这一目标?
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
ruby-on-rails-3.2
asset-pipeline
【解决方案1】:
我不认为将其拆分为不同的页面加载是一个好主意。在生产模式下,所有内容都在一个文件中,因此您的所有 CSS 只需要加载一次。因此,每个后续页面加载都不会再次加载。
这不仅与大小有关,还与网络服务器的连接数和请求数有关。越少越好。
但是,如果您真的想要,您可以在模板的 head 部分中添加一个条件标记。
stylesheet_link_tag 'home' if controller.action_name == 'home'
stylesheet_link_tag 'contact_us' if controller.action_name == 'contact_us'
您也可以使用controller.controller_name获取控制器名称
【解决方案2】:
我了解 Rails 资产管道将所有 CSS 合并到一个文件中。但是,我想知道修改这种行为有多容易(不确定这是否是个好主意)。
我认为这不是一个好主意,因为您将失去仅获取一次 CSS 文件的好处。我不确定这是您追求的目标,但您不会节省任何服务器资源,为特定文件创建额外请求有点昂贵。
无论如何,您可以通过不需要 application.css.scss 中的文件树(或创建特定文件夹)然后手动调用 stylesheet_link_tag 来做到这一点(您可能应该将它与 content_for 帮助器结合起来,这样您就可以说出在哪里正是你想要出现的,见Using the content_for Method)