web-dev-qa-db-ja.com

Rails yield:areaがcontent_forで定義されているかどうかを確認してください

実際のテンプレートがcontent_for(:an__area)を定義したことに基づいて、レイアウトレベルで条件付きレンダリングを実行したいのですが、これを実現する方法はありますか?

91
William Yeung

@content_for_whateverは非推奨です。使用する content_for?代わりに、このように:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
208
gudleik

ヘルパーメソッドを作成するのに本当に必要ではありません:

<% if @content_for_sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

もちろん、あなたの意見では:

<% content_for :sidebar do %>
  ...
<% end %>

私はこれを常に使用して、1列と2列のレイアウトの間を条件付きで移動します

10
efalcao

ヘルパーを作成できます:

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 %>
2
Nick
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
2
gregwinn

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
1
William Yeung

Yieldを2回呼び出すことによるパフォーマンスへの影響はわかりませんが、yieldの内部実装(@content_for_xyzは非推奨)に関係なく、余分なコードやヘルパーメソッドはありません。

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
1
Enrico