Rails проверяет, соответствует ли yield: area в content_for

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

Ответ 1

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

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

Ответ 2

не нужно создавать вспомогательный метод:

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

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

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

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

Ответ 3

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

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

Ответ 4

<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>

Ответ 5

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

Ответ 6

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

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