0

我正在尝试干掉一堆表单代码,这些代码在每个表单的末尾都出现了一组重复的字段。我写了一个包裹 form_for rails 助手的助手。但是我开始迷失在飞来飞去的所有不同范围内......

我的助手是这样的:

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 << options.merge(:option => "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

所以它的功能就像旧的 form_for: 为一些带有特定字段的 :object 创建一个表单。然后将部分附加到一堆模型中常见的字段。

有没有办法做到这一点?也许,有更好的方法?

谢谢!

4

2 回答 2

4

很确定这会起作用

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如果您不需要添加任何字段,您也可以在没有块的情况下调用

于 2011-06-28T18:49:11.880 回答
3

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

布局部分:

<%= 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 %>
于 2011-06-29T12:16:47.860 回答