我们的Rails项目大量使用content_for
。但是,如果使用content_for
未定义任何内容,我们通常需要呈现默认内容。为了便于阅读和维护,将此默认内容放在一个块中是有意义的。
我们在Rails 2.3中创建了一个帮助方法,现在我们已经为Rails 3重构了这个方法(如下所示)。
这些助手都工作得很好,但我想知道是否有更简洁的方法可以在Rails 3中实现同样的目标。
def yield_or(name, content = nil, &block)
ivar = "@content_for_#{name}"
if instance_variable_defined?(ivar)
content = instance_variable_get(ivar)
else
content = block_given? ? capture(&block) : content
end
block_given? ? concat(content) : content
end
这对于这样的事情非常有用:
<%= content_for :sidebar_content do %>
<p>Content for the sidebar</p>
<% end %>
<%= yield_or :sidebar_content do %>
<p>Default content to render if content_for(:sidebar_content) isn't specified</p>
<% end %>
def yield_or(name, content = nil, &block)
if content_for?(name)
content_for(name)
else
block_given? ? capture(&block) : content
end
end
答案 0 :(得分:3)
这可以在使用content_for的视图中完全完成吗?方法
<% if content_for?(:sidebar_content) %>
<%= yield(:sidebar_content) %>
<% else %>
<ul id="sidebar">
<li>Some default content</li>
</ul>
<% end %>