导轨页面标题

Posted

技术标签:

【中文标题】导轨页面标题【英文标题】:rails page titles 【发布时间】:2011-04-19 23:19:15 【问题描述】:

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

应用程序控制器:

def page_title
    "Default Title Here"
end

帖子控制器:

def page_title
    "Awesome Posts"
end

应用布局:

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

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

其次,还有其他人在 Rails 中做页面标题的其他方法吗?

【问题讨论】:

【参考方案1】:

我不同意其他答案,我认为不应按操作设置标题,而应在视图本身内设置。将视图逻辑保留在视图中,将控制器逻辑保留在控制器中。

在您的application_helper.rb 中添加:

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

然后将其插入您的&lt;title&gt;

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

因此,当您在视图中时,您可以访问从控制器设置的所有实例变量,并且可以在那里进行设置。它还可以防止控制器杂乱无章。

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

【讨论】:

其实,我比我自己更喜欢这个答案。我不知道content_for。感谢发帖。 您能否将三元运算符简化为只使用||,例如:content_for(:title) || "Default Title" @AndyJW - 要使三元组工作,您必须执行 content_for(:title).presence || "Default Title" - 如果内容不存在,content_for 将返回 nil 超级甜蜜的解决方案!【参考方案2】:

我喜欢在我的布局中放置一个包罗万象的默认标题,可以通过设置 @title 来从操作中覆盖它:

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

然后你可以在你的动作中生成一个标题:

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

【讨论】:

【参考方案3】:

我会这样做:

# 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>

【讨论】:

这太棒了。几年前没有想到这一点,我觉得有点愚蠢。恕我直言,这是对这个问题的优雅回答。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

布局模板

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

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

页面模板

在页面模板中,您要指定标题来自:

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

【讨论】:

【参考方案6】:
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。这对我来说似乎工作得很好。

【讨论】:

以上是关于导轨页面标题的主要内容,如果未能解决你的问题,请参考以下文章

导轨/Friendly_id。如何为旧的(丑陋的)URL 呈现 404 页面

在一次提交中更新多条记录? - 导轨 3

绕过 XHR 的 CSRF 保护是不是安全? (导轨)

导轨服务器错误? (导轨 3)

导轨和骨干一起工作

导轨设计,没有路线匹配注销