我想要的是在我的观点中做这样的事情:
<% page_header "Your Posts" do %>
<div class="add">
<%= link_to 'Add a new post', new_posts_path %>
</div>
<% end %>
让HTML呈现如下:
<div class="page_header">
<h2>Your Posts</h2>
<div class="add">
<a href="/posts/new">Add a new post</a>
</div>
</div>
但是,有时我不想要任何额外的内容,只需将呈现的HTML设为:
<div class="page_header">
<h2>Your Posts</h2>
</div>
我没有使用两个方法来使用块来呈现额外内容(如果已经给出),或者只是标题(如果不是);通过这种方式,我可以在所有视图中使用通用调用来保持代码DRY。
我的Application Helper中有以下代码,但它似乎没有呈现任何内容:
# Renders a div for the page header with an H2 tag representing the page title
# If a block is provided, renders that content within the page header DIV
def page_header(title, &block)
concat(content_tag(:div, :class => "page_header") do
content_tag(:h2, title)
end)
block.call if block_given?
end
然而,这不起作用。当我给出一个块时,它会正确呈现。但是,如果没有块,它不会呈现任何内容,甚至不是默认值。
我错过了一些简单的解决方法,但我不确定是什么。
答案 0 :(得分:1)
块调用不应该在content_tag中吗?如下所示:
# Renders a div for the page header with an H2 tag representing the page title
# If a block is provided, renders that content within the page header DIV
def page_header(title, &block)
concat(content_tag(:div, :class => "page_header") do
content_tag(:h2, title) +
block_given? ? block.call : ''
end)
end
答案 1 :(得分:-1)
你可以做这样的事情
def page_header(title, &block) concat( render :partial=>"shared/page_header",:locals=>{:title=>title,:body=> capture(&block)}) end部分_page_header.erb 内的
<div class='page-header'> <h2> <%= title %> </h2> <%= body %> </div>