fields_for用于使用数组的has_many关联
控制器: project_sub_types_controller.rb
def new @svn_repos = ['svn_software','svn_hardware'] @project_sub_type = ProjectSubType.new @project_sub_type.repositories.build end
型号: project_sub_type.rb
class ProjectSubType :destroy accepts_nested_attributes_for :repositories def repositories_attributes=(attributes) # Process the attributes hash end end
查看: _form.html.erb
{:class => 'project_subtype_form'} do |f| %>
fields_form inspect元素:
svn_software svn_hardware
提交表单后, params = "repositories_attributes"=>{"0"=>{"repos_name"=>"svn_hardware"}}}
即使在检查了两个复选框之后,它使用的是最后选择的check_box,即’svn_hardware’
[编辑]
期望的输出:我的最终输出应该是用户选择的内容,所以在这种情况下它应该像我之后的提交params =“repositories_attributes”=> {“0”=> {“repos_name”=>“svn_software”} {“ 1 “=> {” repos_name “=>” svn_hardware“}}
我相信两个都有0
作为前缀的原因是你只指定了一个 repository
对象,而你的数组( @svn_repos
)包含两个项目。 因为您只构建了一个新对象(通过@project_sub_type.repositories.build
),所以为同一模型创建了两个复选框。
但是,如果你这样做:
# controller (inside new method) @project_sub_type.repositories.build # 1 new object @project_sub_type.repositories.build # 2 new objects
然后,您必须遍历_form
partial中的这两个对象,并将名称映射到@svn_repos
数组。 我更喜欢这个解决方案:
# controller (inside new method) @project_sub_type.repositories.build name: 'svn_software' @project_sub_type.repositories.build name: 'svn_hardware'
然后使用模型的name
属性而不是数组的name
属性迭代部分中的存储库。
正如Nicolay解释的那样,你得到0的原因是因为你构建了这个@project_sub_type.repositories.build
对象一次。 代码中的所有内容都是正确的。 但是,如果您必须根据DOCS选择多个复选框
在视图中: _form.html.erb更改
<%= ff.check_box :repos_name, {}, "#{repos}", nil %>
至
<%= ff.check_box :repos_name, {:multiple => true}, "#{repos}", nil %>
现在您应该能够在提交后看到params
,如下所示:
=> {“0”=> {“repos_name”=> [“svn_software”,“svn_hardware”]}}