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)
族。更新属性(属性)
@家庭对于表单操作,我更喜欢gemsSlim
、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