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





Хорошо, я собираюсь беззастенчиво ответить себе, так как никто не ответил, и я уже нашел ответ :) Определите его как вспомогательный метод либо в 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) немного аккуратнее, чем вместо того, чтобы проверять, равен ли он нулю. Второй важный момент: переменная экземпляра content_for устарела, поэтому ваше решение не годится для будущего.
Может создать помощника:
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, не знаю, о чем думал я, который был на 6 лет моложе. Я расширяю и оставляю свой ответ для тех, кто все еще использует Rails 2 ... без ненужной преамбулы;)
на самом деле не нужно создавать вспомогательный метод:
<% if @content_for_sidebar %>
<div id = "sidebar">
<%= yield :sidebar %>
</div>
<% end %>
тогда, конечно, на ваш взгляд:
<% content_for :sidebar do %>
...
<% end %>
Я использую это все время для условного перехода между макетом с одним и двумя столбцами.
Я не уверен в последствиях для производительности двойного вызова yield, но это будет происходить независимо от внутренней реализации yield (@content_for_xyz устарел) и без какого-либо дополнительного кода или вспомогательных методов:
<% if yield :sidebar %>
<div id = "sidebar">
<%= yield :sidebar %>
</div>
<% end %>
@content_for_whatever устарел.
Вместо этого используйте content_for?, например:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
Помощник content_for? существует только в Rails 3. В Rails 2 вы можете использовать переменную экземпляра @content_for_....
<%if content_for?(:content)%>
<%= yield(:content) %>
<%end%>
См. Мой отвечать для создания вспомогательного метода для инкапсуляции этого поведения в Rails 3.