Rails:如何更改页面标题?

时间:2008-10-09 04:53:05

标签: ruby-on-rails ruby

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

15 个答案:

答案 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_foryield(: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_forhttp://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)

答案 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变量来为页面定义更具体的标题。