我不喜欢rails默认使用页面标题的方式(只是使用控制器名称),所以我正在研究一种新的方式:
应用程序控制器:
def page_title
"Default Title Here"
end
发布控制器:
def page_title
"Awesome Posts"
end
应用程序布局:
<title><%=controller.page_title%></title>
它运行良好,因为如果我在当前使用的任何控制器中没有page_title方法,它将回退到应用程序控制器中的默认值。但是,如果在我的用户控制器中我希望它返回“注册”以进行“新”操作,但是可以退回到其他任何操作?有没有办法做到这一点?
其次,是否还有其他人在rails中进行页面标题的其他方式?
答案 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
。这对我来说似乎很好用。