我目前拥有一个Customer_nested_attributes_for特性的Customer表单。这些功能可以是任何数量的东西,但为了简单起见,我们将假设他们是名字,姓氏和出生日期(我知道这是EAV的问题 - 如果您对此有意见,请看到我关于这个问题的其他问题)。Rails - 在表单视图中指定属性/动态构建嵌套属性
在我的控制,我有:
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个名字字段。我要的是能够指定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
看来,我可能能够定义这样的辅助方法可以让我添加各种特征字段 - 我很乐意将标记为答案的任何建议,以便如何修改以适应我目前的情况。
你想显示'3种不同类型的功能',这是什么意思?如果我没有真正明白你在问什么:) – pkurek
我已经添加了一个编辑,希望能给出一些额外的清晰的问题。 –