rails页面标题

时间:2010-10-01 16:51:47

标签: html ruby-on-rails title erb

我不喜欢rails默认使用页面标题的方式(只是使用控制器名称),所以我正在研究一种新的方式:

应用程序控制器:

def page_title
    "Default Title Here"
end

发布控制器:

def page_title
    "Awesome Posts"
end

应用程序布局:

<title><%=controller.page_title%></title>

它运行良好,因为如果我在当前使用的任何控制器中没有page_title方法,它将回退到应用程序控制器中的默认值。但是,如果在我的用户控制器中我希望它返回“注册”以进行“新”操作,但是可以退回到其他任何操作?有没有办法做到这一点?

其次,是否还有其他人在rails中进行页面标题的其他方式?

6 个答案:

答案 0 :(得分:85)

我不同意其他答案,我认为标题不应该按行动设定,而应在视图本身内设定。保持视图中的视图逻辑和控制器内的控制器逻辑。

application_helper.rb添加内容

def title(page_title)
  content_for(:title) { page_title }
end

然后将其插入<title>

<title><%= content_for?(:title) ? content_for(:title) : "Default Title" %></title>

因此,当您在视图中时,您可以访问从控制器设置的所有实例变量,您可以在那里设置它。它也可以将杂乱的东西排除在控制器之外。

<%- title "Reading #{@post.name}" %>

答案 1 :(得分:7)

我喜欢在我的布局中添加一个可以通过设置@title来覆盖某个操作的catchall默认标题:

<title><%= @title || "Default Title Here" %></title>

然后您可以在动作中生成标题:

def show
  @post = Post.find_by_id params[:id]
  @title = "tybro's blog: #{@post.title}"
end

答案 2 :(得分:2)

我会这样做:

# Application Controller
before_filter :set_page_title

private

def set_page_title
  @page_title = "Default Title"
end

在其他控制器中覆盖它

# Users Controller
before_filter :set_page_title

def new # in Users controller
  ...
  @page_title = "Sign up"
  ...
end

private

def set_page_title
  @page_title = "Users"
end

在您看来:

<title><%= h @page_title %></title>

答案 3 :(得分:1)

看看Ryan Bates(来自railscasts.com的ryanb)nifty layout。他有一种方法可以满足您的需求。它类似于Garrett的方式,只是他也在帮助器中移动默认值。查看helper.rb文件以及link text如何使用它。

你可以安装为gem(并使用其他不错的功能)或只是使用他的方式。您只需要在每个视图中将标题值传递给title(或者让它降至默认值),然后就可以了。我和加勒特一起把这些东西放在视野中。

答案 4 :(得分:1)

布局模板

在您的布局中(例如application.html.erb)添加:

<title><%= content_for(:page_title) || "Fallback title" %></title>

页面模板

在页面模板中,您需要指定一个标题:

<%- content_for(:page_title, "Specific page title") %>

答案 5 :(得分:0)

class ApplicationController < ActionController::Base
  before_action :set_page_title

  private

  def set_page_title
    @page_title = t(".page_title", default: '').presence || t("#{controller_name}.page_title", default: '').presence || controller_name.titleize
  end
end

我最近开始采用这种方法,然后在布局中输出 @page_title。这对我来说似乎很好用。