我目前有一个接受_nested_attributes_for Features 的客户表单。这些功能可以是任意数量的东西,但为了简单起见,我们假设它们是名字、姓氏和出生日期(我知道这是 EAV 的问题 - 如果您对此有意见,请请参阅我关于该主题的其他问题)。
在我的控制器中,我有:
3.times {@customer.features.build}
这工作正常,并构建了 3 个功能,按预期保存。但是,我想要的是为视图中的每个构建功能指定功能类型。我的观点目前看起来像:
<%= customer.fields_for :features do |features_builder| %>
<%= render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => "First Name", :form_actions_visible => false} %>
<% end -%>
正如人们所期望的那样,这会创建 3 个 First Name 字段。我想要的是能够指定 3 种不同类型的功能,如下所示:
<%= customer.fields_for :features do |features_builder| %>
<%= render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => "First Name", :form_actions_visible => false} %>
<%= render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => "Last Name", :form_actions_visible => false} %>
<%= render :partial => "features/fixed_feature", :locals => {:feature => features_builder, :fixed_feature_type => "Date of Birth", :form_actions_visible => false} %>
<% end -%>
显然,上面编写的代码不起作用,因为它试图为每个实例创建 3 个字段。我似乎需要的是 fields_for 循环上的索引,它允许我遍历并向每个部分添加一个 if 子句,以便它只触发一次,并且每个都在不同的功能实例上触发。
谁能指出我能做到最好吗?搜索后,我似乎找不到获取 fields_for 循环索引的方法。
编辑:根据第一条评论,为清楚起见:我希望在页面上呈现三个功能,一个用于控制器构建的每个功能。我希望每个功能都以不同的方式呈现(在上面的代码中为 :fixed_feature_type 传递了不同的局部变量)。我正在寻找最好的方法来做到这一点。
编辑2:我知道另一种方法是在控制器中动态构建嵌套属性(而不是最初一次构建3个)-有没有办法做到这一点?
编辑 3:花了一些时间寻找一种动态执行此操作的方法后,我从 Railscast 中找到了一个辅助方法,如下所示:
def link_to_add_fields(name, f, association)
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
render(association.to_s.singularize + "_fields", :f => builder)
end
link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
end
看来我可以定义一个这样的辅助方法,允许我添加各种功能字段 - 我很乐意将有关如何修改它以适应我当前情况的任何建议标记为答案。