我有
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>
答案 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