Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails 4中使用单个表单保存多个记录_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

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

Ruby on rails 在Rails 4中使用单个表单保存多个记录,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个名为家庭的模型,它属于:user 我想使用户能够在一个表单中添加多个家庭成员,该表单位于/views/families/new.html.erb 因此,用户会看到一个表单,用于为一个用户id创建3个家庭成员 将数据输入3个相同的表单,然后点击提交 3张单独表格中的数据在提交一次后应保存为数据库中的3条不同记录 现在,当我提交表单时,db中的所有值都保存为NULL 我做错了什么?我不应该使用强参数吗 编辑:对不起,我应该早点提供更详细的代码 在代码中稍加修改后 #config/rout

我有一个名为
家庭
的模型,它属于:user 我想使用户能够在一个表单中添加多个家庭成员,该表单位于
/views/families/new.html.erb

  • 因此,用户会看到一个表单,用于为一个用户id创建3个家庭成员
  • 将数据输入3个相同的表单,然后点击提交
  • 3张单独表格中的数据在提交一次后应保存为数据库中的3条不同记录
  • 现在,当我提交表单时,db中的所有值都保存为NULL
  • 我做错了什么?我不应该使用强参数吗
编辑:对不起,我应该早点提供更详细的代码 在代码中稍加修改后

#config/routes.rb
资源:家庭
#app/models/user.rb
类用户
#app/models/family.rb
类家族
#app/controllers/families_controller.rb
类FamiliesController
#app/views/families/_form.html.erb

家庭成员#:











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

在您的用户模型中

class User < ActiveRecord::Base
    has_many :families, :dependent => :destroy 
    accepts_nested_attributes_for :families, :allow_destroy => true
end
class User < ActiveRecord::Base
    has_many :families, dependent: :destroy 
    accepts_nested_attributes_for :families, reject_if: :all_blank, allow_destroy: true
end
你的强参数应该是这样的

def user_params 
params.require(:user).permit(:name, families_attributes: [:name,:email]) 
end

#users/new.html.erb
<%= form_for(@user) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<%= f.fields_for :familes do |builder| %>
<%= render 'family_fields', :f => builder %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>

#users/_family_fields.html.erb
<div>
<%= f.label :name, "Name" %>        
<%= f.text_field :name %>
<br>
<%= f.label :email, "Email" %>
<%= f.text_field :email %>
</div>
def用户参数
参数require(:user).permit(:name,families\u属性:[:name,:email])
结束
#users/new.html.erb

建筑商%> #users/\u family\u fields.html.erb

您想使用
嵌套表单
。您应该能够复制并粘贴以下代码以开始:

app/models/family.rb

class Family < ActiveRecord::Base
  has_many :users

  accepts_nested_attributes_for :users
end
class User < ActiveRecord::Base
  belongs_to :family
end
<%= form_for(@family) do |f| %>
  <%= f.fields_for :users do |user| %>
    <p>
    <%= user.text_field :name %><br>
    <%= user.text_field :email %>
    </p>
  <% end %>

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

  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\u multiple
。这需要具有以下结构的参数(使用您的族示例,并更新两条记录,ID为123和456)

行动是这样的:

@families = []
params[:families].each do |id, attributes|
  if family = Family.find_by_id(id)
    family.update_attributes(attributes)
    @families << family
  end
end
@families=[]
参数[:族]。每个do | id,属性|
如果family=family.find\u by\u id(id)
族。更新属性(属性)

@家庭对于表单操作,我更喜欢gems
Slim
Simple form
cococoon
。使用cocoon,您可以添加/删除所需的任意多个子记录

用户模型

class User < ActiveRecord::Base
    has_many :families, :dependent => :destroy 
    accepts_nested_attributes_for :families, :allow_destroy => true
end
class User < ActiveRecord::Base
    has_many :families, dependent: :destroy 
    accepts_nested_attributes_for :families, reject_if: :all_blank, allow_destroy: true
end
Cocoon部分
\u family\u fields.html.slim

.nested-fields
  .form-inputs
    = f.input :name, label: false, input_html: { placeholder: 'Name' }
    = f.input :relationship, label: false, input_html: { placeholder: 'Relationship' }

  .remove-instance
    = link_to_remove_association " X ", f

快乐编码!:-)

用户表的属性是什么?:email、:password\u digest加上rails创建的属性。但是我这里没有以任何方式使用用户模型,我只是想用一个表单在“families”表中输入多个记录。一个用户怎么可能有多个族?我认为这个问题缺少模型的代码。很抱歉前面的代码太少了。我已经用更多的信息更新了这个问题,从最佳实践的角度来看,我非常感谢您的帮助,这是解决代码编写方式问题的好方法吗?我正在尝试使用您的代码,结果得到了
ActiveModel::ForbiddenAttributesError(ActiveModel::ForbiddenAttributesError):
但我只是想确定这种方法是否专业。谢谢
class User < ActiveRecord::Base
    has_many :families, dependent: :destroy 
    accepts_nested_attributes_for :families, reject_if: :all_blank, allow_destroy: true
end
class UsersController < ApplicationController
  def new
    @user = User.new
    @user.families.build # This builds default nested form in cocoon
  end

  def create
    @user = User.new(user_params)
    @user.save
  end

  private
  def user_params
    params.require(:user).permit(
      :name, :email,
      families_attributes: [:id, :name, :relationship, :_destroy])
  end
end
.form
  = simple_form_for(@user) do |f|

      = f.input :name, label: false, input_html: { placeholder: 'Name' }

      = f.input :email, label: false, input_html: { placeholder: 'Email' }        

      .cocoon-form
        = f.simple_fields_for :families do |family|
          = render 'family_fields', f: family
    
      .links
        = link_to_add_association 'Add a member', f, :families

  .form-actions
    = f.submit
.nested-fields
  .form-inputs
    = f.input :name, label: false, input_html: { placeholder: 'Name' }
    = f.input :relationship, label: false, input_html: { placeholder: 'Relationship' }

  .remove-instance
    = link_to_remove_association " X ", f