実際のテンプレートがcontent_for(:an__area)
を定義したことに基づいて、レイアウトレベルで条件付きレンダリングを実行したいのですが、これを実現する方法はありますか?
@content_for_whatever
は非推奨です。使用する content_for?
代わりに、このように:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
ヘルパーメソッドを作成するのに本当に必要ではありません:
<% if @content_for_sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
もちろん、あなたの意見では:
<% content_for :sidebar do %>
...
<% end %>
私はこれを常に使用して、1列と2列のレイアウトの間を条件付きで移動します
ヘルパーを作成できます:
def content_defined?(var)
content_var_name="@content_for_#{var}"
!instance_variable_get(content_var_name).nil?
end
レイアウトでこれを使用します。
<% if content_defined?(:an__area) %>
<h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
<%if content_for?(:content)%>
<%= yield(:content) %>
<%end%>
OK.
def content_defined?(symbol)
content_var_name="@content_for_" +
if symbol.kind_of? Symbol
symbol.to_s
elsif symbol.kind_of? String
symbol
else
raise "Parameter symbol must be string or symbol"
end
!instance_variable_get(content_var_name).nil?
end
Yieldを2回呼び出すことによるパフォーマンスへの影響はわかりませんが、yieldの内部実装(@content_for_xyzは非推奨)に関係なく、余分なコードやヘルパーメソッドはありません。
<% if yield :sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>