Я хочу сделать условный рендеринг на уровне макета на основе фактического определенного шаблона content_for(:an__area)
, есть идеи, как это сделать?
Я хочу сделать условный рендеринг на уровне макета на основе фактического определенного шаблона content_for(:an__area)
, есть идеи, как это сделать?
Ответы:
@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_sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
тогда, конечно, на ваш взгляд:
<% content_for :sidebar do %>
...
<% end %>
Я использую это все время, чтобы условно переходить между макетом в один и два столбца.
Может создать помощника:
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 %>
Хорошо, я собираюсь беззастенчиво ответить себе, так как никто не ответил, и я уже нашел ответ :) Определите это как вспомогательный метод либо в 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 устарела, поэтому ваше решение не годится для будущего
Я не уверен в последствиях для производительности двойного вызова yield, но это будет происходить независимо от внутренней реализации yield (@content_for_xyz устарело) и без какого-либо дополнительного кода или вспомогательных методов:
<% if yield :sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>