的prependeded @
字符到一個變量是變量什麼暴露到視圖範圍。在你的控制器:
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>
我只想使用符號':title',我不想改變一切。 – zoonman
@zoonman然後嘗試我的編輯。 – sjagr
不適用於我的情況。我更新了問題,它有適當的格式。 – zoonman