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


97

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


私を参照してください答えをこのRailsの3で動作カプセル化するために、ヘルパーメソッドを作成するために
tristanm

回答:


217

@content_for_whatever廃止予定です。content_for?代わりに、次のように使用します。

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

16
ヘルパーcontent_for?はRails 3にのみ存在します。Rails2では、@content_for_...インスタンス変数を使用できます。
LEST

10

ヘルパーメソッドを作成する必要はありません。

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

そしてもちろんあなたの見解では:

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

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



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 %>

これは質問に対する答えを提供しません。批評したり、著者に説明を求めたりするには、投稿の下にコメントを残してください。
eirikir、2015年

私は@eirikirに同意します、私の6歳の自己が何を考えていたかはわかりません。私はまだRails 2.にいる人たちのために私の答えを拡張して残しています。不要なプリアンブルなしで;)
Nick

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

ええと、私はあなたの自己返信が好きですが...マイナーな点instance_variable_defined?(content_var_name)は、それがnilであるかどうかをテストするのではなく、少しきれいです。2番目に大きなポイントは、content_forインスタンス変数が非推奨になり、ソリューションが将来の証拠にならない
Dave Nolan

1

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

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.