Ruby on rails 使用嵌套表单更新不同表中的两条记录
我的表单正在更新测试仪记录(它是最终用户)。我还试图更新许多属于测试人员的applied_程序记录 我正在向控制器发送参数,但无法使其更新应用的程序记录。它试图使用所有参数,而不仅仅是应用的程序参数来更新它 表格: 应用程序模型:Ruby on rails 使用嵌套表单更新不同表中的两条记录,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,我的表单正在更新测试仪记录(它是最终用户)。我还试图更新许多属于测试人员的applied_程序记录 我正在向控制器发送参数,但无法使其更新应用的程序记录。它试图使用所有参数,而不仅仅是应用的程序参数来更新它 表格: 应用程序模型: belongs_to :tester 控制器: def update_tester @applied_programs = AppliedProgram.where(tester_id: @tester.id) @tester.update_attribut
belongs_to :tester
控制器:
def update_tester
@applied_programs = AppliedProgram.where(tester_id: @tester.id)
@tester.update_attributes(tester_params)
@applied_programs.each do |p|
p.update_attributes(tester_params)
end
end
def tester_params
params.require(:tester).permit(:name, :email, :phone_number, :address1,
:city, :zip_code, :country, :password, :password_confirmation,
:active, :approved, applied_programs_attributes: [ :approved, :id ])
end
日志:
Processing by AdminsController#update_tester as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"x", "tester"=>{"name"=>"Dave", "email"=>"nope@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "applied_programs_attributes"=>{"0"=>{"approved"=>"0", "id"=>"9"}, "1"=>{"approved"=>"1", "id"=>"745"}}}, "commit"=>"Save Changes", "id"=>"16"}
Tester Load (0.1ms) SELECT `testers`.* FROM `testers` WHERE `testers`.`id` = 16 LIMIT 1
Tester Load (1.1ms) SELECT `testers`.* FROM `testers` WHERE `testers`.`remember_token` = 'x' LIMIT 1
(6.8ms) BEGIN
AppliedProgram Load (2.6ms) SELECT `applied_programs`.* FROM `applied_programs` WHERE `applied_programs`.`tester_id` = 16 AND `applied_programs`.`id` IN (9, 745)
Tester Exists (0.8ms) SELECT 1 AS one FROM `testers` WHERE (`testers`.`email` = 'nope@gmail.com' AND `testers`.`id` != 16) LIMIT 1
(0.1ms) COMMIT
AppliedProgram Load (0.1ms) SELECT `applied_programs`.* FROM `applied_programs` WHERE `applied_programs`.`tester_id` = 16
(0.1ms) BEGIN
(12.4ms) ROLLBACK
Completed 500 Internal Server Error in 95ms
ActiveRecord::UnknownAttributeError (unknown attribute: name)
您的问题是
应用程序的循环
您需要执行以下操作:
def update_tester
@applied_programs = AppliedProgram.where(tester_id: @tester.id)
@tester.update_attributes(tester_params)
end
def tester_params
params.require(:tester).permit(:name, :email, :phone_number, :address1,
:city, :zip_code, :country, :password, :password_confirmation,
:active, :approved, applied_programs_attributes: [ :approved, :id ])
end
我假设您的
测试仪
模型上有一个名称
属性,而不仅仅是一个可访问的属性
?这些属性都在表中。问题不在于任何测试仪属性。它们更新得很好。当它更新应用程序时,只有approved属性要更新为true或False,我知道,但是您的日志显示ActiveRecord::UnknownAttributeError(unknown属性:name)
。当您添加接受嵌套的\u属性时,您也不需要循环使用应用的\u程序
,它允许您通过父模型更新关联的模型。/这是在AppliedProgram加载查询期间,因为它正试图更新该表。测试仪表已提交。请尝试将:id
添加到您的测试仪参数中,如参数require(:Tester).permit(:id,:name,:email,:phone_number,:address1,:city,:zip_code,:country,:password,:password_confirmation,:active,:approved,applied_programs:[:approved,:id])
。对于更新
操作,您需要允许:id
。这可能是导致错误的原因。它在哪里更新AppliedPrograms?测试仪参数
具有应用程序属性
。当您更新@tester
时,它会更新AppliedProgram
,因为您有接受:AppliedProgram
的嵌套属性。哦,我明白了!太棒了,+1因为我的固执得到了深入的帮助哈哈,没问题,这是Rails学习曲线的一部分。祝你好运
Processing by AdminsController#update_tester as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"x", "tester"=>{"name"=>"Dave", "email"=>"nope@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "applied_programs_attributes"=>{"0"=>{"approved"=>"0", "id"=>"9"}, "1"=>{"approved"=>"1", "id"=>"745"}}}, "commit"=>"Save Changes", "id"=>"16"}
Tester Load (0.1ms) SELECT `testers`.* FROM `testers` WHERE `testers`.`id` = 16 LIMIT 1
Tester Load (1.1ms) SELECT `testers`.* FROM `testers` WHERE `testers`.`remember_token` = 'x' LIMIT 1
(6.8ms) BEGIN
AppliedProgram Load (2.6ms) SELECT `applied_programs`.* FROM `applied_programs` WHERE `applied_programs`.`tester_id` = 16 AND `applied_programs`.`id` IN (9, 745)
Tester Exists (0.8ms) SELECT 1 AS one FROM `testers` WHERE (`testers`.`email` = 'nope@gmail.com' AND `testers`.`id` != 16) LIMIT 1
(0.1ms) COMMIT
AppliedProgram Load (0.1ms) SELECT `applied_programs`.* FROM `applied_programs` WHERE `applied_programs`.`tester_id` = 16
(0.1ms) BEGIN
(12.4ms) ROLLBACK
Completed 500 Internal Server Error in 95ms
ActiveRecord::UnknownAttributeError (unknown attribute: name)
def update_tester
@applied_programs = AppliedProgram.where(tester_id: @tester.id)
@tester.update_attributes(tester_params)
end
def tester_params
params.require(:tester).permit(:name, :email, :phone_number, :address1,
:city, :zip_code, :country, :password, :password_confirmation,
:active, :approved, applied_programs_attributes: [ :approved, :id ])
end