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_attributes
的update
操作,那么它怎么可能不更新它? 我认为这是因为请求没有给出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