我将如何在 application.html.erb 的 Rails 中显示不同的标题?

Posted

技术标签:

【中文标题】我将如何在 application.html.erb 的 Rails 中显示不同的标题?【英文标题】:How would I display different headers in Rails in application.html.erb? 【发布时间】:2014-11-17 02:43:14 【问题描述】:

如何在我的 application.html.erb 视图中显示 Rails 中不同版本的标头?例如,对于我的登录页面,我有一个相当大的标题,其中包括一个标注和一些注册和登录按钮。对于其他静态页面,我有一个带有徽标的普通小标题和一些右侧的链接。对于我的仪表板,当用户登录时,它看起来也会有些不同。

如何在 if/else 语句中显示某些标头,Rails 将根据我的 application.html.erb 中的当前 url 或视图输出不同版本的标头?

【问题讨论】:

【参考方案1】:

要通过示例回答您的问题,您可能想要这样做。 Rails 规定使用content_foryield 标签使用嵌套视图模板。 做以下事情来实现你想要的 -

    app/views/layouts/application.html.erb 中 - 添加一个充当if else 的三元表达式。在渲染视图时,rails 将在视图模板中查找<% content_for :custom_header do %>。如果它没有发现它将渲染部分app/views/layouts/_default_header.html.erb

    <html>
    <head>
      <title><%= @page_title or "Page Title" %></title>
      <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
      <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
      <%= csrf_meta_tags %>
    </head>
    <body>
      <!-- Code to conditionally load a header -->
      <%= content_for?(:custom_header) ? yield(:custom_header) : render :partial => "layouts/default_header" %></div>
    
      <!-- For the body -->
      <%= yield %>
    </body>
    </html>
    

    既然你说大多数页面都会有一个静态的小标题,请将其 html 代码保存在app/views/layouts/_default_header.html.erb 下的部分中。

    在您的登录页面(例如视图app/views/welcome/index.html.erb)中,您可以使用content_for 标记和我们在application.html.erb 中使用的标识符:custom_header 在您的着陆页中添加以下内容。

    <% content_for :custom_header do %>
      <div class="custom-header">
        <!-- Your complex header with sign in and signup links... -->
      </div>
    <% end %>
    

application.html.erb 中的三元运算符将从着陆页的 content_for 标记中提取此内容,并插入该内容以代替 yield(:custom_header)

希望这会有所帮助。

【讨论】:

这是一个不错的解决方案。我遇到了&lt;%= content_for?(:custom_header) ? yield(:custom_header) : render :partial =&gt; "layouts/default_header" %&gt;&lt;/div&gt; 的问题,我不得不在render 方法中使用括号。例如:&lt;%= content_for?(:custom_header) ? yield(:custom_header) : render(partial: "layouts/default_header") %&gt;&lt;/div&gt;【参考方案2】:

听起来您可能想使用nested layout。

【讨论】:

以上是关于我将如何在 application.html.erb 的 Rails 中显示不同的标题?的主要内容,如果未能解决你的问题,请参考以下文章

我将如何在 python 中实现 vigenere 密码

我将如何在此代码中使用 Sevenzipsharp?

我将如何在 Java 中迭代堆栈 [关闭]

我将如何在打字稿中定义这个对象?

我将如何在这里实现回溯?

我将如何在 Scala 中表达链式赋值?