Rails проверяет, если yield: область определена в content_for - PullRequest
90 голосов
/ 11 октября 2008

Я хочу сделать условный рендеринг на уровне макета, основываясь на фактическом шаблоне, который определил content_for(:an__area), есть идеи, как это сделать?

Ответы [ 6 ]

206 голосов
/ 12 марта 2010

@content_for_whatever устарело. Вместо этого используйте content_for?, например:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
10 голосов
/ 11 марта 2009

нет необходимости создавать вспомогательный метод:

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

тогда, конечно, на ваш взгляд:

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

Я использую это все время, чтобы условно переходить между одной колонкой и двумя колонками

2 голосов
/ 18 февраля 2014
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
2 голосов
/ 11 марта 2009

Может создать помощника:

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 %>
1 голос
/ 16 ноября 2009

Я не уверен в последствиях производительности для вызова yield дважды, но это будет происходить независимо от внутренней реализации yield (@content_for_xyz устарела) и без какого-либо дополнительного кода или вспомогательных методов:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
1 голос
/ 11 октября 2008

Хорошо, я собираюсь бесстыдно сделать ответ, поскольку никто не ответил, и я уже нашел ответ :) Определите это как вспомогательный метод либо в 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
...