Given the following:
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
The request that gets sent only has the names
, but not the ids
.
And the following models
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
When I make a POST
request to /websites/save.json
, the Website
gets updated correctly if it exists, but the Plugins
that belong to it always get recreated causing duplicate content in the Database. Why does this happen? I redirect to the update
action which calls update_attributes
so how can it be that it does not update it? I take it that it's because no ID is given with the request.
Can I make the Controller
listen to plugin_name
instead of plugin_id
?
Modify your controller to have this:
def update
@website = Website.find_by_name(params[:website][:name])
if @website.update(params)
redirect_to website_path(@website)
else
render :edit
end
end
Also, if you're using strong_parameters
, you'll need this at the bottom of your controller:
params.require(:website).
permit(
:name,
...,
plugins_attributes: [
:name,
...,
]
)
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With