Ruby on rails 使用嵌套表单更新不同表中的两条记录

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

我的表单正在更新测试仪记录(它是最终用户)。我还试图更新许多属于测试人员的applied_程序记录

我正在向控制器发送参数,但无法使其更新应用的程序记录。它试图使用所有参数,而不仅仅是应用的程序参数来更新它

表格:

应用程序模型:

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