查看application.html.erb包含以下内容
PIVOT
如何从控制器的方法将数据传递给此视图?
我的意思是使用符号<title><%= content_for?(:title) ? yield(:title) : t(:stocktaking_title) %></title>
。我不太了解Ruby。
:title
Rails 4.1.9,ruby 2.0.0(2014-05-08)[universal.x86_64-darwin14]
答案 0 :(得分:2)
变量的预先附加@
字符是将变量公开给视图范围的内容。在您的控制器中:
def show
@title = "My Title"
end
让任何渲染的模板文件使用以下方式访问它:
<%= @title %>
显然,你正在寻找某种标题处理逻辑。也许您可以尝试用以下内容替换application.html.erb
文件中的代码:
<% if @title %>
<title><%= @title %></title>
<% elsif content_for?(:title) %>
<title><%= yield(:title) %></title>
<% else %>
<title><%= t(:stocktaking_title) %></title>
<% end %>
您可以将其浓缩为三元组,但视图不会非常易读。
如果您坚持在控制器内部使用content_for
,则可以使用view_context
方法,但似乎无法直接使用content_for
:
view_context.content_for(:title, "My Awesome Title")
相反,您需要实施自己的content_for
方法以延伸view_context
。我pulled it from this Gist,但这是代码:
class ApplicationController < ActionController::Base
...
# FORCE to implement content_for in controller
def view_context
super.tap do |view|
(@_content_for || {}).each do |name,content|
view.content_for name, content
end
end
end
def content_for(name, content) # no blocks allowed yet
@_content_for ||= {}
if @_content_for[name].respond_to?(:<<)
@_content_for[name] << content
else
@_content_for[name] = content
end
end
def content_for?(name)
@_content_for[name].present?
end
end
这已经过测试并且有效。
然后在控制器中执行content_for :title, "My Awesome Title"
。
严重的是,使用@title
将更容易,更少“hacky”。你甚至可以做这样酷的事情:
<title><%= @title || content_for(:title) || t(:stocktaking_title) %></title>