我正在尝试干掉一堆表单代码,这些表单代码在每个表单的末尾出现一组重复的字段。我写了一个包装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 << 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:为某些形式创建一个表单:具有特定字段的对象。然后在partial中添加一组模型中常见的字段。
有没有办法实现这一目标?也许,还有更好的方法吗?
谢谢!
答案 0 :(得分: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
答案 1 :(得分:2)
您也可以使用部分布局,这是参考语法。
布局部分:
<%= 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 %>