I've been away from Rails for a while now, so maybe I'm missing something simple.
我已经离开Rails一段时间了,所以也许我错过了一些简单的东西。
How can you accomplish this:
你怎么能做到这一点:
<%= yield_or :sidebar do %>
some default content
<% end %>
Or even:
甚至:
<%= yield_or_render :sidebar, 'path/to/default/sidebar' %>
In the first case, I'm trying:
在第一种情况下,我正在尝试:
def yield_or(content, &block)
content_for?(content) ? yield(content) : yield
end
But that throws a 'no block given' error.
但是这会引发“无阻塞”错误。
In the second case:
在第二种情况:
def yield_or_render(content, template)
content_for?(content) ? yield(content) : render(template)
end
This works when there's no content defined, but as soon as I use content_for to override the default content, it throws the same error.
这在没有定义内容时有效,但只要我使用content_for覆盖默认内容,它就会抛出相同的错误。
I used this as a starting point, but it seems it only works when used directly in the view.
我用这个作为起点,但它似乎只有在视图中直接使用时才有效。
Thanks!
谢谢!
3 个解决方案
#1
13
How about something like this?
这样的事怎么样?
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% else %>
<div>default_content_here</div>
<% end %>
Inspiration from this SO question
这个问题的启示
#2
5
Try this:
尝试这个:
# app/helpers/application_helper.rb
def yield_or(name, content = nil, &block)
if content_for?(name)
content_for(name)
else
block_given? ? capture(&block) : content
end
end
so you could do
所以你可以做到
<%= yield_or :something, 'default content' %>
or
要么
<%= yield_or :something do %>
block of default content
<% end %>
where the default can be overridden using
可以使用覆盖默认值
<%= content_for :something do %>
overriding content
<% end %>
#3
0
I didn't know you could use content_for(:content_tag)
without a block and it will return the same content as if using yield(:content_tag)
.
我不知道你可以在没有块的情况下使用content_for(:content_tag),它将返回与使用yield(:content_tag)相同的内容。
So:
所以:
def yield_or_render(content, template)
content_for?(content) ? content_for(content) : render(template)
end
#1
13
How about something like this?
这样的事怎么样?
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% else %>
<div>default_content_here</div>
<% end %>
Inspiration from this SO question
这个问题的启示
#2
5
Try this:
尝试这个:
# app/helpers/application_helper.rb
def yield_or(name, content = nil, &block)
if content_for?(name)
content_for(name)
else
block_given? ? capture(&block) : content
end
end
so you could do
所以你可以做到
<%= yield_or :something, 'default content' %>
or
要么
<%= yield_or :something do %>
block of default content
<% end %>
where the default can be overridden using
可以使用覆盖默认值
<%= content_for :something do %>
overriding content
<% end %>
#3
0
I didn't know you could use content_for(:content_tag)
without a block and it will return the same content as if using yield(:content_tag)
.
我不知道你可以在没有块的情况下使用content_for(:content_tag),它将返回与使用yield(:content_tag)相同的内容。
So:
所以:
def yield_or_render(content, template)
content_for?(content) ? content_for(content) : render(template)
end