Я хочу сделать условный рендеринг на уровне макета на основе фактического шаблона, который определен content_for(:an__area)
, любая идея, как это сделать?
Rails проверяет, соответствует ли yield: area в content_for
Ответ 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 %>