我将如何在 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_for
和yield
标签使用嵌套视图模板。
做以下事情来实现你想要的 -
在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)
。
希望这会有所帮助。
【讨论】:
这是一个不错的解决方案。我遇到了<%= content_for?(:custom_header) ? yield(:custom_header) : render :partial => "layouts/default_header" %></div>
的问题,我不得不在render
方法中使用括号。例如:<%= content_for?(:custom_header) ? yield(:custom_header) : render(partial: "layouts/default_header") %></div>
【参考方案2】:
听起来您可能想使用nested layout。
【讨论】:
以上是关于我将如何在 application.html.erb 的 Rails 中显示不同的标题?的主要内容,如果未能解决你的问题,请参考以下文章