102

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

4

6 に答える 6

224

@content_for_whatever廃止されました。content_for?代わりに、次のように使用します。

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
于 2010-03-11T22:05:59.870 に答える
3
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
于 2014-02-18T16:49:28.580 に答える
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 %>
于 2009-03-11T20:28:14.453 に答える
1

誰も答えていないので、私は恥知らずに自己応答を行います。私はすでに答えを見つけています:) application_helper.rbまたは便利な場所で、これをヘルパーメソッドとして定義します。

  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
于 2008-10-11T16:01:17.763 に答える
1

yield を 2 回呼び出すことによるパフォーマンスへの影響についてはよくわかりませんが、yield の内部実装 (@content_for_xyz は非推奨) に関係なく、追加のコードやヘルパー メソッドを使用しなくても実行できます。

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
于 2009-11-16T12:01:49.347 に答える