干掉一个帮手:包装form_for并访问本地表单变量

我试图干掉一堆表单代码,这些表单代码在每个表单的末尾出现一组重复的字段。 我写了一个包装form_for rails helper的帮助器。 但是我开始迷失在飞来飞去的所有不同范围……

我的助手是这样的:

def simple_form_helper(record_or_name_or_array, *args, &proc) options = ... # overriding some options, not relevant form_for(record_or_name_or_array, *(args < "blah")) , &proc) # i wish to access &proc and append the call to render # to within &procs scope (to access block local variable) concat render('shared/forms/submit') # this obv does not work end 

在shared / forms / _submit.erb中,我有一堆字段和提交一组模型共有的按钮。 所以我希望从form_for的范围内呈现它,以便可以访问f。

  f.text_field :foo f.hidden_field :bar f.submit "Save" 

想法是在视图中使用它:

 simple_form_helper :object do |f| f.text_field :name f.text_field :description f.text_field :other_field # want common fields and submit button appended here # I could just call render("shared/forms/submit") here # but that does not seem very DRY. Or am I too unreasonable? end 

所以它的function就像旧的form_for:为某些forms创建一个表单:具有特定字段的对象。 然后在partial中添加一组模型中常见的字段。

有没有办法实现这一目标? 或许,还有更好的方法吗?

谢谢!

很确定这会奏效

 def simple_form_helper(record_or_name_or_array, *args) options = ... # overriding some options, not relevant form_for(record_or_name_or_array, *(args << options.merge(:option => "blah"))) do |f| yield f if block_given? concat f.text_field :foo concat f.hidden_field :bar concat f.submit "Save" end end 

如果您不需要添加任何字段,也可以在没有块的情况下调用simple_form_helper :object

您也可以使用部分布局,这里是参考语法。

布局部分:

 <%= form_for(record_or_name_or_array, :class => my_local_variable) do |f| %> <%= f.hidden_field :some_field %> <%= yield f %> <%= f.submit "Save" %> <%- end %> 

模板或部分在哪里使用布局:

 <%= render :layout => "partial_layout_name", :locals => {:my_local_variable => value} do |f| %> <%= f.text_field :more_fields_here %> <%- end %>