在不使用插件的情况下为Rails应用中的网页创建自定义标题的最佳方法是什么?
答案 0 :(得分:231)
在你的观点中做这样的事情:
<% content_for :title, "Title for specific page" %>
<!-- or -->
<h1><%= content_for(:title, "Title for specific page") %></h1>
布局文件中包含以下内容:
<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>
也可以将content_for
和yield(:title)
语句封装在辅助方法中(正如其他人已经建议的那样)。但是,在这种简单的情况下,我喜欢将必要的代码直接放入特定的视图中,而无需自定义帮助程序。
答案 1 :(得分:117)
这是一个我喜欢使用的简单选项
在您的布局中
<head>
<title><%= @title %></title>
</head>
位于页面模板的顶部(第一行)
<% @title="Home" %>
由于解析布局和页面模板的方式,在渲染布局之前会评估@ title =“Home”。
答案 2 :(得分: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
然后在布局视图中,您只需使用:
<title><%= page_title %></title>
......并且在视图中:
<%= page_heading "Awesome" %>
这种方式的优点是可以让你在你标题的h1标签的位置随机播放,并保持你的控制器很好,没有讨厌的@title变量。
答案 3 :(得分:20)
@opsb 的改进以及更完整的 @FouZ 形式:
在application.html.erb
:
<title><%= @title || "Default Page Title" %></title>
在视图erb文件或其控制器中:
<% @title = "Unique Page Title" %>
答案 4 :(得分:13)
查看content_for
:http://railscasts.com/episodes/8
答案 5 :(得分:6)
如果没有关于您试图满足的用例或要求的进一步细节,我可以考虑几种选择:
1)在一个布局页面中切换标题,并使用存储在application_helper.rb
<title><%= custom_title %></title>
此方法将为每个布局页面提供唯一的标题。
2)Railscasts建议使用partial来加载HEAD标签之间显示的内容
3)如果您需要在加载事件后更改标题,请使用javascript / ajax调用来操作DOM。
也许您真的不想更改title
元素标记的内容。也许您确实需要某种面包屑,以便您的用户始终知道他们相对于您网站的导航层次结构的位置。虽然我对goldberg插件的处理方式做得很好,但我确信还有其他方法可以实现相同的功能。
答案 6 :(得分:3)
我使用nifty_generator的“nifty_layout”,它提供了一个标题变量,然后我可以在页面上调用:
<% title "Title of page" %>
我还可以通过用户<% title "Title of page", false %>
将标题显示在浏览器标题中,而不是显示在页面本身中。
答案 7 :(得分:2)
您也可以在控制器的before_filter中设置它。
# foo_controller.rb
class FooController < ApplicationController
before_filter :set_title
private
def set_title
@page_title = "Foo Page"
end
end
# application.html.erb
<h1><%= page_title %></h1>
然后,您可以在 set_title 方法中设置条件,为控制器中的不同操作设置不同的标题。能够在控制器中看到所有相关的页面标题真是太好了。
答案 8 :(得分:1)
这种简单的方法设置了默认标题,但也让您可以随时覆盖它。
在app/views/layouts/application.html.erb
中:
<title><%= yield(:title) || 'my default title' %></title>
要覆盖该默认设置,请将其放置在您喜欢的任何视图中
<% content_for :title, "some new title" %>
答案 9 :(得分:0)
我使用这个插件我写的这些Rails助手:http://web.archive.org/web/20130117090719/http://henrik.nyh.se/2007/11/my-rails-title-helpers/
答案 10 :(得分:0)
最好/最干净的方法:
<title><%= @page_title or 'Page Title' %></title>
答案 11 :(得分:0)
使用content_for方法和部分
进行页面标题的方法1。部分名称:_page_title.html.erb
<%content_for :page_title do %>
<%=title%>
<%end%>
2。在标题标记
中的application.html.erb中的用法 <title><%=yield :page_title %></title>
3。在* .html.erb中的用法,不包括application.html.erb 只需将其粘贴在任何.html.erb中并提供页面标题
即可 e.g : inside index.html.erb
<%=render '_page_title', title: 'title_of_page'%>
答案 12 :(得分:0)
简而言之,我可以按照以下方式写下来
<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
答案 13 :(得分:0)
我喜欢opsb的方法,但这种方法也适用。
<% provide(:title,"ttttttttttttttttttZ") %>
<html>
<head><title><%= yield(:title) %></title></head>
<body></body>
</html>
答案 14 :(得分:-9)
我想添加一个非常简单的变体。
在ApplicationController中定义此方法:
def get_title
@action_title_name || case controller_name
when 'djs'
'Djs'
when 'photos'
'Photos'
when 'events'
'Various events'
when 'static'
'Info'
when 'club'
'My club'
when 'news'
'News'
when 'welcome'
'Welcome!'
else
'Other'
end
end
之后,您可以从布局的标题标签中调用get_title。您可以通过在操作中定义@action_title_name变量来为页面定义更具体的标题。