如何在控制器中设置标题?

时间:2015-06-16 16:34:57

标签: ruby-on-rails ruby-on-rails-4

查看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]

1 个答案:

答案 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>