我已经离开Rails一段时间了,所以也许我错过了一些简单的东西.
你怎么能做到这一点:
<%= yield_or :sidebar do %>
some default content
<% end %>
Run Code Online (Sandbox Code Playgroud)
甚至:
<%= yield_or_render :sidebar, 'path/to/default/sidebar' %>
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我正在尝试:
def yield_or(content, &block)
content_for?(content) ? yield(content) : yield
end
Run Code Online (Sandbox Code Playgroud)
但是这会引发"无阻塞"错误.
在第二种情况:
def yield_or_render(content, template)
content_for?(content) ? yield(content) : render(template)
end
Run Code Online (Sandbox Code Playgroud)
这在没有定义内容时有效,但只要我使用content_for覆盖默认内容,它就会抛出相同的错误.
我用这个作为起点,但它似乎只有在视图中直接使用时才有效.
谢谢!
我们的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
Run Code Online (Sandbox Code Playgroud)
这对于这样的事情很有用:
<%= 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 %>
Run Code Online (Sandbox Code Playgroud)
def yield_or(name, content = nil, &block)
if content_for?(name) …Run Code Online (Sandbox Code Playgroud) 以下是我的应用程序布局文件
.container_12.clearfix
= render :partial => 'shared/flashes'
.grid_8
= render :partial => 'shared/search'
= yield
.grid_4
= yield(:sidebar)
Run Code Online (Sandbox Code Playgroud)
它必须是网格,一个用于内容,另一个用于侧边栏.现在我正在创建一个登录页面,其中我不想显示我的侧边栏(只是单个网格.我可以简单地创建新的布局,其中.grid_12 div作为单个网格.
但这让我有2个应用程序布局.如何使相同的应用程序布局条件化以产生侧边栏?
如果使用侧边栏,它将与上面的相同,只是一个.grid_12,如下所示
.container_12.clearfix
= render :partial => 'shared/flashes'
.grid_12
= render :partial => 'shared/search'
= yield
Run Code Online (Sandbox Code Playgroud)