【问题标题】:Rails - How do I use application.html.erb in my custom layout?Rails - 如何在我的自定义布局中使用 application.html.erb?
【发布时间】:2015-05-07 11:20:35
【问题描述】:

我有一个名为“Pages”的控制器,其中包含大约 5 个页面(视图),我已经为其渲染了一个名为“page.html.erb”的布局。 所以我的“页面”控制器有:

class PagesController < ApplicationController
layout 'page' 

我希望我的“page.html.erb”布局默认使用“application.html.erb”。如何使我的自定义布局“page.html.erb”自动继承/呈现“application.html.erb”?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-2


    【解决方案1】:

    如果您没有在控制器中指定布局,Rails 将默认呈现您的 application 布局。如果您遵循此约定,您可以使用application.html.erb 作为您的整个网站页面结构(也是包含样式表和javascript 的好地方)。然后,您可以在布局中使用 = yield 来指定应在何处呈现控制器视图。

    默认情况下,控制器操作将呈现其相应的视图。例如,如果您在控制器bars_controller.rb 中有一个动作foo,Rails 将呈现/app/views/bars/foo.html.erb,除非您重定向或指定要在动作中呈现的不同视图。事实上,如果你只想在foo 中做的只是渲染页面,你甚至不需要在控制器中定义动作!

    约定优于配置我的朋友。

    【讨论】:

    • application.html.erb 默认采用。我已经呈现了一个单独的布局,称为“页面”,它只有一个菜单栏。所有其他背景和标题详细信息都在我的“应用程序”布局中。我想找到一种方法来合并“应用程序”和“页面”布局。我想这是不可能的。
    • 没错,您需要从每个控制器操作和视图的基本布局(或无布局)开始。对于您的情况,我建议有条件地在应用程序布局中呈现页面布局。因此,无论您希望页面布局出现在何处:&lt;%= render 'layouts/pages' if params[:controller] == 'pages' %&gt;。这将仅包括页面控制器的应用程序布局中的页面布局。
    • 是的,我实现了一个类似的方法。除了我的“应用程序”布局之外,我将其余的页面数据呈现为部分数据,并且显示得很好。
    【解决方案2】:

    我通常将我的布局分成更小的部分(页眉、页脚、HTML HEAD 等)。通过这种方式,我可以通过将不同的部分混合在一起来使用多个布局。

    【讨论】:

    • 看来我们无法将 2 个布局组合在一起。正如您所说,最好的方法是渲染不同的部分。谢谢。
    【解决方案3】:

    我也遇到了和你一样的挑战,但对于我来说,我希望我的主页其他页面有一个稍微不同的标题 .

    这是我的工作原理

    我所要做的就是在 app/views/shared 目录中创建 2 个标题部分:

    _home_header.html.erb
    _other_header.html.erb
    

    然后我在app/views/layouts/application.html.erb文件中这样引用它:

    <%= render partial: '/shared/home_header' if params[:controller] == 'homes' %>
    <%= render partial: '/shared/other_header' if params[:controller] != 'homes' %>
    

    也可以使用显式的 if 条件来引用它:

    <% if params[:controller] == 'homes' %>
      <%= render partial: '/shared/home_header' %>
    <% elsif params[:controller] != 'homes' %>
      <%= render partial: '/shared/other_header' %>
    <% else %>
    <% end %> 
    

    感谢 steve klein 的评论让我对此有了深入的了解。

    就是这样。

    我希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多