导轨页面标题
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
然后将其插入您的<title>
:
<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
。这对我来说似乎工作得很好。
【讨论】:
以上是关于导轨页面标题的主要内容,如果未能解决你的问题,请参考以下文章