在Rails 4中使用单个表单保存多个记录

我有一个名为Family的模型,它属于User用户我想让用户在单个表单中添加多个家庭成员,这位于/views/families/new.html.erb

编辑:对不起,我应该在稍微修改代码后提供更详细的代码

在routes.rb资源中:系列编辑:在User.rb中

class User < ActiveRecord::Base has_many :families end 

编辑:在Family.rb

 class Family < ActiveRecord::Base belongs_to :user end 

在FamiliesController中

 def new end 

编辑:我已经这样修改了表单:

    

Family Member # :












编辑:在FamiliesController中创建动作

 def create @family = Family.new(family_params) a = params[:family][:"0"] @family.user_id = current_user.id if @family.save flash[:notice] = params[:family][:"0"] redirect_to dummy_path else flash[:notice] = "didnt happen" end end 
  • 因此,用户可以看到一个表单,用于为一个user_id创建3个系列成员
  • 将数据输入3个相同的表单,然后点击提交
  • 来自3个单独表单的数据应该在提交一次时在数据库中保存为3个不同的记录

编辑:我正在使用强大的参数,如下所示:

 def family_params params.require(:family).permit(:all) end 
  • 现在,当我提交表单时,db中的所有值都保存为NULL。

  • 我究竟做错了什么? 我不应该使用powershell的参数吗?

您想使用nested forms 。 您应该能够复制并粘贴以下代码以开始:

应用程序/模型/ family.rb

 class Family < ActiveRecord::Base has_many :users accepts_nested_attributes_for :users end 

应用程序/模型/ user.rb

 class User < ActiveRecord::Base belongs_to :family end 

应用程序/视图/家庭/ new.html.erb

 <%= form_for(@family) do |f| %> <%= f.fields_for :users do |user| %> 

<%= user.text_field :name %>
<%= user.text_field :email %>

<% end %> <%= f.submit %> <% end %>

应用程序/控制器/ families_controller.rb

  [...] def new @family = Family.new 3.times { @family.users.build } end [...] private # Use callbacks to share common setup or constraints between actions. def set_family @family = Family.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def family_params params.require(:family).permit(:name, users_attributes: [ :name, :email ]) end 

我总是这样做的方法是创建一个新的动作update_multiple 。 这需要具有以下结构的params(使用您的Family示例,并使用ID 123和456更新两个记录)

 params = {:families => {123 => {:name => "foo", :address => "bar"}, 456 => {:name => "baz", :address => "qux"} }} 

并且动作如下:

 @families = [] params[:families].each do |id, attributes| if family = Family.find_by_id(id) family.update_attributes(attributes) @families << family end end 

为了设置具有所需结构的参数,您的表单将设置如下:

 <% @families.each do |family| %> 
<% end %>

你可以,而不是做一个新的动作,改变你的update动作的结构来做标准代码,如果它得到参数[:family]和上面的代码,如果它得到参数[:系列]。

您需要像这样调整代码。假设您在users表中有属性name

在您的用户模型中

 class User < ActiveRecord::Base has_many :families, :dependent => :destroy accepts_nested_attributes_for :families, :allow_destroy => true end 

在您的users_controller中

 def new @user = User.new @family = 3.times { @user.families.build } #here end 

你的强参数应该是这样的

 def user_params params.require(:user).permit(:name, families_attributes: [:name,:email]) end #users/new.html.erb <%= form_for(@user) do |f| %> 
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :familes do |builder| %> <%= render 'family_fields', :f => builder %> <% end %>
<%= f.submit %>
<% end %> #users/_family_fields.html.erb
<%= f.label :name, "Name" %> <%= f.text_field :name %>
<%= f.label :email, "Email" %> <%= f.text_field :email %>