将Rails 3块助手包装在另一个助手中

时间:2012-03-23 00:27:40

标签: ruby-on-rails ruby-on-rails-3

我想创建一个这样的帮手(我正在使用Formtastic宝石):

def admin_form_for(record, columns = nil, &block)
  semantic_form_for [:admin, record] do |f|
    f.semantic_errors
    f.inputs *columns if columns
    capture(f, &block) if block_given?
    f.buttons
  end
end

我正在尝试包装一个块帮助器admin_form_for,然后我们调用一些输出文本的方法,然后在它的中间捕获一个ERB块。

我尝试过各种各样的事情

capture(f, &block) if block_given?

yield f if block_given?

concat(capture(f, &block)) if block_given?
似乎没什么用。

帮助的使用最终看起来像这样:

<%= admin_form_for @record, [:name, :email] do |f| %>
  <p><%= some_other_helper %></p>
<% end %>

2 个答案:

答案 0 :(得分:0)

抱歉,没有测试,但你可以试试这个:

def admin_form_for(record, columns = nil, &block)
  semantic_form_for [:admin, record] do |f|
    f.semantic_errors
    f.inputs *columns if columns
    f.semantic_fields_for(columns, &block) if columns && block_given?
    f.buttons
  end
end

答案 1 :(得分:0)

我知道这已经晚了一个月,但我认为这就是你要找的东西:

def admin_form_for(record, columns = nil, &block)
  with_output_buffer do  
    semantic_form_for [:admin, record] do |f|
      f.semantic_errors
      f.inputs *columns if columns
      capture(f, &block) if block_given?
      f.buttons
    end
  end
end

这里with_output_buffer返回一个字符串,表示传入块所呈现的内容。