【问题标题】:How to include a css or javascript in an erb that is outside the layout?如何在布局之外的 erb 中包含 css 或 javascript?
【发布时间】:2010-10-03 13:51:17
【问题描述】:

抱歉,我正在编写我的第一个 Rails 应用程序。

我了解布局视图,但如果您正在使用它们,有没有办法包含视图特定的 js 或 css 文件?例如,我有layouts/products.html.erb,对于products/edit.html.erb,我想要products_edit.css,但我不希望所有产品视图都使用该css,实现这一目标的最佳实践是什么?

【问题讨论】:

    标签: ruby-on-rails view erb


    【解决方案1】:

    如果您有一个通用的 edit.css 文件,我建议您在布局中添加一个 if

    <%= stylesheet_link_tag 'edit' if params[:action] == 'edit' %>
    

    否则,您可以使用 content_foryield 将其他标签添加到头部。

    layout.html.erb

    <head>
      ...
      <%= yield(:header) if @content_for_header %>
    </head>
    

    products/edit.html.erb

    <% content_for :header do -%>
      <%= stylesheet_link_tag 'edit_product' %>
    <% end -%>
    

    【讨论】:

    • 我不确定您是否想要 stylesheet_link_tag 行上的 '
    • 是的,你需要它,视图使用一个名为 capture 的助手,它接受一个块,这个助手会将所有输出重定向到一个变量,然后在不同的位置呈现。所以我的解决方案给你更多的灵活性,感觉更自然。
    • 在 Rails 3.0 中,你需要使用if content_for? :header,而不是@content_for_header
    • 在没有if @content_for_header的情况下,在 Rails 5 中为我工作
    【解决方案2】:

    您可以通过执行以下操作在布局的 head 标签内添加样式表标签:

    布局/products.html.erb:

    ... ...

    产品/edit.html.erb

    【讨论】:

      【解决方案3】:

      如果您的 &lt;/head&gt; 标签在您的布局中,则不能。

      您可能希望该控制器操作具有不同的布局。像这样在渲染中:

       render :action => "index", :layout => "some_other_layout
      

      您还可以在控制器类中使用此行为整个控制器设置不同的默认布局:

      layout "some_other_layout"
      

      查看 API 文档,您可以使用该布局方法的条件来做一些复杂的事情。

      【讨论】:

      • -1,你错了。使用 yield(:header) 和 content_for :header 你可以为 head 标签指定额外的内容。
      • 这并没有改变它的其余部分是完美的合法解决问题的事实。
      • 不是,但是它违反了rails这么爱的DRY原则。
      • 怎么样?如果足够多,我可以通过部分解决布局中的重复。我想说你的解决方案将太多的布局知识推到模板中,除了明确界定的合同之外,这些模板应该不知道它们包含什么。
      • 使用不同的布局只添加一个css文件会在布局中引入重复的代码。当您可以添加非常强大且非常干燥的功能时。而且你真的不应该对否决票那么小气,不要个人认为。
      猜你喜欢
      • 2016-12-30
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多