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”]}}