7

鉴于以下情况:

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

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

我可以让Controllerplugin_name而不是plugin_id吗?

4

1 回答 1

1

修改你的控制器有这个:

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
于 2015-12-03T16:36:33.740 回答