Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't update my nested model form for has_one association

I try to create a nested model form for the has_one association. (i'm using Rails 4)

In my user, and adress model i have the following :

class User < ActiveRecord::Base
 has_one :address
 accepts_nested_attributes_for :address
end

class Address < ActiveRecord::Base
 belongs_to :user

end

my user controller :

class UsersController < ApplicationController
    .
    .
    .
    def edit
      @user = User.find(params[:id]) 
      @user.build_address if @user.address.nil?
    end 

    def update
      @user = User.find(params[:id])
      if @user.update(params.require(:user).permit(:user_name, address_attributes: [:street]))
        flash[:success] = "Profile updated successfully"
        sign_in @user
        redirect_to @user
      else
         flash.now[:error] = "Cannot updating your profile"
         render 'edit'
      end
    end
end

finally in my view i have :

= form_for(@user) do |f|
  = render 'shared/error_messages', object: f.object
  %div
    = f.label :user_name, "User name"
    = f.text_field :user_name
    = f.fields_for :address do |add|
      = addd.label :street
      = d.text_field :street
    = f.submit "Update"

When i try to fill street filed for the first time it works, but when i try to update i get the error : Failed to remove the existing associated address. The record failed to save after its foreign key was set to nil

any idea where is the error ? thank's

like image 564
medBouzid Avatar asked Sep 24 '13 14:09

medBouzid


2 Answers

There is an option to make it do a partial update if the record already exists:

accepts_nested_attributes_for(:address, update_only: true)

Documented here: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#method-i-accepts_nested_attributes_for

like image 132
stoodfarback Avatar answered Nov 03 '22 17:11

stoodfarback


in your controller UsersController, in the update method, add the address: :id to the address permitted attributes. Like this:

params.require(:user).permit(:user_name, address_attributes: [:id, :street]))
like image 32
d34n5 Avatar answered Nov 03 '22 17:11

d34n5