Rails:如何更改页面标题?

wus*_*her 157 ruby ruby-on-rails

在不使用插件的情况下为Rails应用程序中的页面创建自定义标题的最佳方法是什么?

Chr*_*ssl 237

在您的视图中执行以下操作:

<% content_for :title, "Title for specific page" %>
<!-- or -->
<h1><%= content_for(:title, "Title for specific page") %></h1>
Run Code Online (Sandbox Code Playgroud)

以下是布局文件:

<head>
  <title><%= yield(:title) %></title>
  <!-- Additional header tags here -->
</head>
<body>
  <!-- If all pages contain a headline tag, it's preferable to put that in the layout file too -->
  <h1><%= yield(:title) %></h1>
</body>
Run Code Online (Sandbox Code Playgroud)

也可以将content_foryield(:title)语句封装在辅助方法中(正如其他人已经建议的那样).但是,在这种简单的情况下,我喜欢将必要的代码直接放入特定的视图中,而无需自定义帮助程序.

  • 我将这个答案与下面的答案合并为每个页面创建一个"默认标题":`<title> <%=(yield(:title)+" - "除非yield(:title).blank?).to_s +"这总是在布局中显示"%> </ title>"和`<%content_for:title,"视图中的条件标题"%>`. (23认同)
  • 当我使用 `&lt;h1&gt;&lt;%= content_for(:title, "Title for certain page") %&gt;&lt;/h1&gt;` 时,我没有看到任何内容输出到我的 DOM 中(即我有 `&lt;h1&gt;&lt;/h1&gt; ` 其中没有内容)。但是我的“&lt;title&gt;特定页面的标题&lt;/title&gt;”工作正常。有任何想法吗? (2认同)
  • `&lt;标题&gt;&lt;%= 产量(:标题).存在 || 'default_title' %&gt;&lt;/title&gt;` 添加默认标题 (2认同)

ops*_*psb 118

这是我喜欢使用的简单选项

在你的布局中

<head>
  <title><%= @title %></title>
</head>
Run Code Online (Sandbox Code Playgroud)

在页面模板的顶部(第一行)

<% @title="Home" %>
Run Code Online (Sandbox Code Playgroud)

由于解析布局和页面模板的方式,因此在呈现布局之前评估@ title ="Home".

  • 值得注意的是,这不适用于rails视图缓存.在rails 3中,content_for非常智能,可以正常使用缓存(请参阅选定的答案). (30认同)
  • 不应该在控制器内设置变量? (4认同)
  • @SajjadMerchant一般我同意,是的变量应该在控制器中设置.在这种情况下,模板感觉更合适,因为您指定了特定于页面外观的属性.控制器动作也可以由两个不同的视图使用(不是经常发生这种情况,我用它来说明标题与特定模板的紧密联系). (2认同)

Aup*_*ajo 49

最佳做法是使用content_for.

首先,添加几个辅助方法(即粘贴在app/helpers/application_helper.rb中):

def page_title(separator = " – ")
  [content_for(:title), 'My Cool Site'].compact.join(separator)
end

def page_heading(title)
  content_for(:title){ title }
  content_tag(:h1, title)
end
Run Code Online (Sandbox Code Playgroud)

然后在布局视图中,您可以简单地使用:

<title><%= page_title %></title>
Run Code Online (Sandbox Code Playgroud)

......并且在视图中:

<%= page_heading "Awesome" %>
Run Code Online (Sandbox Code Playgroud)

这种方式的优点是允许你在标题的h1标签贴在哪里,并保持你的控制器很好,没有讨厌的@title变量.

  • 如何设置`@ content_for_title`的值? (4认同)

bou*_*uby 20

@opsb的改进和更完整的@FouZ形式:

application.html.erb:

<title><%= @title || "Default Page Title" %></title>
Run Code Online (Sandbox Code Playgroud)

在视图erb文件或其控制器中:

<% @title = "Unique Page Title" %>
Run Code Online (Sandbox Code Playgroud)


Ala*_*lan 6

如果没有关于您试图满足的用例或要求的进一步细节,我可以考虑几种选择:

1)在一个布局页面中切换标题并使用存储的辅助方法 application_helper.rb

<title><%= custom_title %></title>
Run Code Online (Sandbox Code Playgroud)

这种方法将为每个布局页面提供一个唯一的标题.

2)Railscasts建议使用partial来加载HEAD标签之间显示的内容

3)如果需要在加载事件后更改标题,请使用javascript/ajax调用来操作DOM.

也许你真的不想改变title元素标记的内容.也许您确实需要某种面包屑,以便您的用户始终知道他们相对于您网站的导航层次结构的位置.虽然我对goldberg插件的处理方式做得很好,但我确信还有其他方法可以实现相同的功能.


use*_*745 6

这种简单的方法可以设置默认标题,但也可以让您随时覆盖它。

app/views/layouts/application.html.erb

<title><%= yield(:title) || 'my default title' %></title>
Run Code Online (Sandbox Code Playgroud)

要覆盖该默认值,请将其放置在您喜欢的任何视图中

<% content_for :title, "some new title" %>
Run Code Online (Sandbox Code Playgroud)

  • 你必须使用 `yield(:title).presence` ,这样如果接收者不存在它就会返回 nil 。以防万一它对其他人不起作用。 (3认同)