Rails 3-设置页面标题的理想方法

在 Rails 3中设置页面标题的正确方法是什么? 目前我正在做以下工作:

App/views/layouts/application.html:

<head>
<title><%= render_title %></title>
<%= csrf_meta_tag %>

App/helpers/application _ helper. rb:

def render_title
return @title if defined?(@title)
"Generic Page Title"
end

App/controller/some _ controller. rb:

def show
@title = "some custom page title"
end

有没有其他[更好的]做上述事情的方法?

39223 次浏览

你可以做一个简单的帮手:

def title(page_title)
content_for :title, page_title.to_s
end

在你的布局中使用它:

<title><%= yield(:title) %></title>

然后从你的模板调用它:

<% title "Your custom title" %>

希望这有所帮助;)

@akfalcon - I use a similar strategy, but without the helper.. I just set the default @title in the application controller and then use, <%=@title%> in my layout. If I want to override the title, I set it again in the controller action as you do. No magic involved, but it works just fine. I do the same for the meta description & keywords.

我实际上正在考虑将它移动到数据库,这样管理员就可以更改标题等,而不必更新 Rails 代码。您可以创建一个包含内容、操作和控制器的 PageTitle 模型。然后创建一个帮助器,为当前呈现的控制器/操作(使用 controller _ name 和 action _ name 变量)查找 PageTitle。如果未找到匹配项,则返回默认值。

@ apeacox-在模板中设置标题是否有好处?我认为最好将它放在控制器中,因为标题直接与被调用的操作相关。

我发现 apeacox 的解决方案对我不起作用(在 Rails 3.0.3中)。

相反,我做到了。

application_helper.rb:

def title(page_title, options={})
content_for(:title, page_title.to_s)
return content_tag(:h1, page_title, options)
end

在布局中:

<title><%= content_for(:title) %></title>

观点:

<% title "Page Title Only" %>

或者:

<%= title "Page Title and Heading Too" %>

注意,这还允许我们检查是否存在标题,并在视图未指定标题的情况下设置默认标题。

在布局中,我们可以这样做:

<title><%= content_for?(:title) ? content_for(:title) : 'This is a default title' %></title>

不需要创建任何额外的函数/助手。

在应用程序布局中

<% if content_for?(:title) %>
<%= content_for(:title) %>
<% else %>
<title>Default title</title>
<% end %>

在特定的布局中

<% content_for :title do %>
<title>Custom title</title>
<% end %>

你也可以检查这个 铁路广播。我认为它将是非常有用的,给你基本的开始。

注意: 如果你想要更多的动态页面与 pjax

这是我最喜欢的方式:

Application _ helper. rb

module ApplicationHelper
def title(*parts)
content_for(:title) { (parts << t(:site_name)).join(' - ') } unless parts.empty?
end
end

Views/layouts/application.html. erb

<title>
<%= content_for?(:title) ? yield(:title) : t(:site_name) %>
</title>

Config/locales/en.yml

en:
site_name: "My Website"

这有一个很好的优势,总是回到您所在地区的站点名称,这可以在每种语言的基础上进行翻译。

然后,在其他页面(比如关于页面) ,你可以简单地写:

视图/主页/关于.html. erb

<% title 'About' %>

该页面的结果标题将是:

关于-我的网站

简单:)

我有个更复杂的解决方案。我想管理我的所有标题在我的区域设置文件。我还希望为显示和编辑页面包含有意义的标题,以便在页面标题中包含资源的名称。最后,我想在每个页面标题中包含应用程序名称,例如 Editing user Gustav - MyApp

为了实现这一点,我在 application_helper.rb中创建了一个助手,它完成了大部分繁重的工作。这将尝试从区域设置文件中获取给定操作的名称,如果有,则获取指定资源的名称,并将这些名称与应用程序名称组合在一起。

# Attempt to build the best possible page title.
# If there is an action specific key, use that (e.g. users.index).
# If there is a name for the object, use that (in show and edit views).
# Worst case, just use the app name
def page_title
app_name = t :app_name
action = t("titles.#{controller_name}.#{action_name}", default: '')
action += " #{object_name}" if object_name.present?
action += " - " if action.present?
"#{action} #{app_name}"
end


# attempt to get a usable name from the assigned resource
# will only work on pages with singular resources (show, edit etc)
def object_name
assigns[controller_name.singularize].name rescue nil
end

您需要在您的地区文件中以下列形式添加特定行动的文本:

# en.yml
titles:
users:
index: 'Users'
edit: 'Editing'

如果您希望在单一视图中使用有意义的资源名称,则可能需要添加两个代理方法,例如。

# User.rb
def name
username
end

我认为这将是好的:

<title>
<% if @title %>
<%= @title %>
<% else %>
Your title
<% end %>
</title>

并在控制器中为@title 赋值,否则标题将为 Your title

我更喜欢这样:

module ApplicationHelper
def title(*page_title)
if Array(page_title).size.zero?
content_for?(:title) ? content_for(:title) : t(:site_name)
else
content_for :title, (Array(page_title) << t(:site_name)).join(' - ')
end
end
end

如果调用 title时没有参数,则返回 title 的当前值或默认值,在这个示例中,默认值是“ Example”。

它使用参数调用 title,并将其设置为传递的值。

# layouts/application.html.erb
<title><%= title %></title>


# views/index.html.erb
<% title("Home") %>


# config/locales/en.yml
en:
site_name: "Example"

我的答案更简单:

Locales/any _ archive. yml :

pt-BR:
delivery_contents:
title: 'Conteúdos de Entregas'


groups:
title: 'Grupos'

Application.html.Slim内部:

title
= "App Name: #{t("#{controller_name.underscore}.title")}"

有一个操作布局变量(标题、描述等)的简单方法:

# app/views/application.html.erb
<title>
<%= content_for :title || 'App default title' %>
</title>


# app/views/posts/index.html.erb
<%= content_for :title, 'List of posts' %>

其他页面的标题将具有 App default title

应用程序布局:

# app/views/layouts/application.html.erb


<title><%= (yield :title) || 'General title' %></title>

然后在每个视图中你想要一个特定的标题:

<% content_for :title, 'Specific title' %>

已经有一些很好的答案,但是我将添加我的简单方法

- if content_for?(:title)
-title = "My site | #{content_for(:title)}"
-else
-title = "My site | #{controller_name.titleize}"

您可以在所有视图上自动获得一个很好的名称,比如“ My site | Posts”——或者不管控制器是什么。

当然,可以选择可以通过添加以下内容来为视图设置标题:

- content_for(:title, 'About')

并得到一个标题像“我的网站 | 关于”。