Ruby on rails 3 Rails 3-设置页面标题的理想方式

Ruby on rails 3 Rails 3-设置页面标题的理想方式,ruby-on-rails-3,Ruby On Rails 3,在rails 3中设置页面标题的正确方法是什么。目前我正在做以下工作: app/views/layouts/application.html: <head> <title><%= render_title %></title> <%= csrf_meta_tag %> app/controllers/some_controller.rb: def show @title = "some custom page title"

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

app/views/layouts/application.html:

<head>
  <title><%= render_title %></title>
  <%= csrf_meta_tag %>
app/controllers/some_controller.rb:

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

有没有其他/更好的方法来完成上述任务?

您可以选择一个简单的助手:

def title(page_title)
  content_for :title, page_title.to_s
end
在布局中使用它:

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

然后从模板中调用它:

<% title "Your custom title" %>


希望这有帮助;)

@akfalcon-我使用类似的策略,但没有助手。。我只是在应用程序控制器中设置默认的@title,然后在布局中使用。如果我想覆盖标题,我会像您一样在控制器操作中再次设置它。没有魔法,但效果很好。我对元描述和关键字也这样做

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


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

我发现apeacox的解决方案不适合我(在Rails 3.0.3中)

相反,我做了

应用程序\u 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><%= 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获得更多动态页面,这是我的首选方法:

应用程序\u helper.rb

module ApplicationHelper
  def title(*parts)
    content_for(:title) { (parts << t(:site_name)).join(' - ') } unless parts.empty?
  end
end
<title>
  <%= content_for?(:title) ? yield(:title) : t(:site_name) %>
</title>
<% title 'About' %>
这有一个很好的优势,就是在您的区域设置中总是返回到站点名称,它可以按语言进行翻译

然后,在其他每一页(如关于页)上,您可以简单地写:

views/home/about.html.erb

module ApplicationHelper
  def title(*parts)
    content_for(:title) { (parts << t(:site_name)).join(' - ') } unless parts.empty?
  end
end
<title>
  <%= content_for?(:title) ? yield(:title) : t(:site_name) %>
</title>
<% title 'About' %>

该页面的最终标题为:

关于-我的网站


简单:)

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

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

您需要以以下形式在区域设置文件中添加特定于操作的文本:

# en.yml 
titles:
  users:
    index: 'Users'
    edit: 'Editing'
如果您想在单一视图中使用有意义的资源名称,您可能需要添加几个代理方法,例如

# User.rb
def name
  username
end

我想这会很好:

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

你的头衔
并在控制器中为@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

我的答案更简单:

地区/any_archive.yml

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

  groups:
    title: 'Grupos'
title
  = "App Name: #{t("#{controller_name.underscore}.title")}"
以及application.html.slim的内部:

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

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

有一种操作布局变量(标题、说明等)的简单方法:

#app/views/application.html.erb
#app/views/posts/index.html.erb
在应用程序布局中,其他页面的标题将具有
应用程序默认标题

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

<title><%= (yield :title) || 'General title' %></title>
#app/views/layouts/application.html.erb
然后在需要特定标题的每个视图中:

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

已经有了一些很好的答案,但我将添加我的简单方法。将此添加到layouts/application.html

- if content_for?(:title)
  -title = "My site | #{content_for(:title)}"
-else
  -title = "My site | #{controller_name.titleize}"
你会自动在你的所有视图上得到一个好名字,比如“我的网站帖子”——或者任何控制器

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

- content_for(:title, 'About')

并获得像“我的站点|关于”这样的标题。

在控制器内设置标题不是一个好做法,因为前者是关于视图的,后者是关于业务逻辑的。例如,有一个“blog”控制器,根据post.title设置标题是正常的,没有理由在控制器中设置标题,但在模板或布局文件中设置标题非常优雅;)但是可能需要更改helper:
内容,例如:title,page\u title。为了反映Andrew的建议,我编辑了答案(Andrea的解决方案在rails 3中不起作用),问题是这个答案是错误的。除非这里有魔术师。对于要使用此助手方法设置的标题,必须先调用
title
,因为后者主要在布局中,所以这不起作用。人们很难理解这个答案:@MichaelSzyndel你说的不是真的。Rails通常先渲染模板,然后渲染布局。随着流媒体技术的引入,这一点有所改变,但即使启用了流媒体技术,这仍然会起作用,尽管为
使用新的
provide
over
content\u会更好。我想Rails 4也是如此,对吗?如果是,最好在答案中的某个地方注意到这一点,这样人们就不会怀疑他们是否应该继续搜索Rails版本是否为4+
content\u了(
- content_for(:title, 'About')