在Rails中使用块创建通用HTML标头

时间:2009-10-21 19:37:31

标签: ruby-on-rails ruby

我想要的是在我的观点中做这样的事情:

<% 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

然而,这不起作用。当我给出一个块时,它会正确呈现。但是,如果没有块,它不会呈现任何内容,甚至不是默认值。

我错过了一些简单的解决方法,但我不确定是什么。

2 个答案:

答案 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>