Rails accepted_nested_attributes_for始终创建嵌套模型,但不更新它们

鉴于以下内容:

class WebsitesController < ApplicationController # POST /websites/save # POST /websites/save.json def save Website.exists?(name: params[:website][:name]) ? update : create end # POST /websites # POST /websites.json def create @server = Server.find_or_create_by_name(params[:server_id]) @website = @server.websites.new(params[:website]) #etc... @website.save end # PUT /websites/1 # PUT /websites/1.json def update @website = Website.find_by_name(params[:website][:name]) #etc... @website.update_attributes end end 

客户端没有这些模型的任何ID

发送的请求只有names ,但不包含ids

以下型号

 class Website < ActiveRecord::Base serialize :website_errors attr_accessible :plugins_attributes has_many :plugins accepts_nested_attributes_for :plugins end class Plugin < ActiveRecord::Base belongs_to :website end 

当我向/websites/save.json发出POST请求时,如果Website存在, Website会正确更新,但是属于它的Plugins总是会被重新创建,从而导致数据库中出现重复内容。 为什么会这样? 我重定向到调用update_attributesupdate操作,那么它怎么可能不更新它? 我认为这是因为请求没有给出ID。

我可以让Controller监听plugin_name而不是plugin_id吗?

修改您的控制器以使其具有:

 def update @website = Website.find_by_name(params[:website][:name]) if @website.update(params) redirect_to website_path(@website) else render :edit end end 

此外,如果您使用的是strong_parameters ,则需要在控制器的底部使用:

 params.require(:website). permit( :name, ..., plugins_attributes: [ :name, ..., ] ) end