I have two models: User and Profile.
User has_one Profile, and Profile belongs_to User.
How to update a Profile?
I have done it this way:
def update
@user = User.find(session[:member_id])
@profile = @user.profile
updated = @profile.update_attributes(params[:profile])
if updated
flash[:success] = “Your profile was updated.”
redirect_to show_profile_path
else
render :edit
end
end
Is this “the Rails way” to update the model object?
It seems very verbose to me, so I tried this:
def update
@user = User.find(session[:member_id])
@profile = @user.build_profile(params[:profile])
if @profile.save
flash[:success] = “Your profile was updated.”
redirect_to show_profile_path
else
render :edit
end
end
This works well when the form is valid, but when it is not, there are
problems, as “build_profile” deletes the associated object before saving
it
again (Profile in this case), so it will be nil. I understand that this
is
not the correct way.
In my User model I have defined the association like this:
has_one :profile, dependent: :destroy
If I remove the dependent option, then when trying to update using the
latest code will throw this:
“Failed to remove the existing associated profile. The record failed to
save when after its foreign key was set to nil.”