Rails总是使用accepts_nested_attributes_for为嵌套表单生成新对象

时间:2017-05-11 06:09:20

标签: ruby-on-rails

我有

class Deal < ApplicationRecord
  belongs_to :company, dependent: :destroy
  accepts_nested_attributes_for :company

class DealsController < ApplicationController
  def update
    respond_to do |format|
      if @deal.update(deal_params)
        format.html { redirect_to dashboard_path, notice: 'Deal was successfully updated.' }
      ...

  def deal_params
    params.require(:deal).permit :name, ...
      company_attributes: [:name, ...]

当它提交表单时,我看到了

  Parameters: {"utf8"=>"√", "deal"=>{"name"=>"Office building", ...
  "company_attributes"=>{"name"=>"...", "id"=>"25"}}, "commit"=>"Update Deal", "id"=>"1"}
Unpermitted parameter: id

但它始终会创建 Company模型,而不是更新现有的关联模型。我不知道它为什么要创建一个新模型。我不会在:id数组中包含company_attributes,因为我担心有人可能会使用它来更新不属于他们的内容。

为什么Rails总是创建新的Company模型而不是更新现有的Company模型?

This问题类似,但没有回答我的问题。

Rails 5.0.2

请求HTML:

<div class="form-group">
  <label for="deal_company_attributes_name">Name</label>
  <input class="form-control" type="text" value="West Side Offices LLC" name="deal[company_attributes][name]" id="deal_company_attributes_name">
</div>
...
<input type="hidden" value="26" name="deal[company_attributes][id]" id="deal_company_attributes_id">
<div class="actions">
  <input type="submit" name="commit" value="Update Deal" class="btn btn-primary" data-disable-with="Update Deal">
</div>

1 个答案:

答案 0 :(得分:2)

  

但它始终会创建一个新的公司模型,而不是更新   现有的相关模型。我不知道为什么要创建新模型。

要使 更新 生效,您应该在:id中加入company_attributes。这就是StrongParameters处理accepts_nested_attributes_for

的方式
  

为了使用Accept_nested_attributes_for和强参数,   您需要指定应该使用哪些嵌套属性   列入白名单。您可能想要允许:id和:_destroy,请参阅   ActiveRecord :: NestedAttributes以获取更多信息。

def deal_params
  params.require(:deal).permit :name, ...
      company_attributes: [:id, :name, ...]
end