Hi,
I am having some issues when updating an object that has a nested attribute.
My model objects are:
***User***
class User < ActiveRecord::Base has_one :portal_user
accepts_nested_attributes_for :portal_user
validates_presence_of :username end
***PortalUser***
class PortalUser < ActiveRecord::Base belongs_to :user,:dependent => :destroy, :foreign_key => :user_id end
I have got the action `update` defined in the User controller like this:
class UsersController < ApplicationController # PUT /users/1 # PUT /users/1.xml def update @user = User.find(params[:id])
respond_to do |format| if @user.update_attributes(params[:user]) format.html { redirect_to(@user, :notice => 'User was successfully updated.') } format.xml { head :ok } else flash[:error] = "Error while updating personnal information." format.html { render :action => edit_profiles_path } format.xml { render :xml => @user.errors, :status => :unprocessable_entity } end end end end
The update action for the PortalUser controller is also defined:
class PortalUsersController < ApplicationController
def update @portal_user = PortalUser.find(params[:id])
respond_to do |format| if @portal_user.update_attributes(params[:portal_user]) format.html { redirect_to(@portal_user, :notice => 'PortalUser was successfully updated.') } format.xml { head :ok } else flash[:error] = "Error while updating PortalUser." format.html { render :action => edit_profiles_path } format.xml { render :xml => @portal_user.errors, :status => :unprocessable_entity } end end end
end
And finally I have a `Profile` controller that hosts the nested form:
class ProfilesController < ApplicationController def edit # Note: I am using a hard coded Id on purpose. @user = User.find(980190962) end end
View of the Profile's action `edit`:
<%= form_for @user do |f| %>
<%= f.fields_for :portal_user do |f_portal_user| %> <%= f_portal_user.label :firstname %> <br/> <%= f_portal_user.text_field :firstname %> <br/>
<%= f_portal_user.label :lastname %> <br/> <%= f_portal_user.text_field :lastname %> <br/> <% end %>
<%= f.label :username %> <br/> <%= f.text_field :username %><br/>
<%= f.fields_for :portal_user do |f_portal_user| %> <%= f_portal_user.label :phone %> <br/> <%= f_portal_user.text_field :phone %><br/>
<%= f_portal_user.label :cellular_phone %> <br/> <%= f_portal_user.text_field :cellular_phone %><br/> <% end %>
<%= submit_tag "Update" %> <% end %>
When I go to the edit page, I can see the information of the user (both @user and @portal_user) loaded into the form but when I edit the form and send the update nothing happens!
To help you discover the origin of my problem here is the 'trace' (in this I tried to rename to change the username field from *Amokrane* to *amk*:
Started POST "/users/980190962" for 127.0.0.1 at 2011-02-13 19:38:05 +0100 Processing by UsersController#update as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"UA +dbbmwZKpbNYscIvEsqPFwlBkr7yEok1xpYP3/T6k=", "user"=>{"portal_user_attributes"=>{"firstname"=>"Amokrane", "lastname"=>"Chentir", "id"=>"980190962", "phone"=>"", "cellular_phone"=>"0668002010"}, "username"=>"amk"}, "commit"=>"Update", "id"=>"980190962"} User Load (0.1ms) SELECT `users`.* FROM `users` WHERE (`users`.`id` = 980190962) LIMIT 1 SQL (0.1ms) BEGIN PortalUser Load (0.3ms) SELECT `portal_users`.* FROM `portal_users` WHERE (`portal_users`.user_id = 980190962) LIMIT 1 SQL (0.2ms) ROLLBACK SQL (0.1ms) BEGIN SQL (0.1ms) ROLLBACK DEPRECATION WARNING: Giving a path to render :action is deprecated. Please use render :template instead. (called from realtime at /usr/local/rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/benchmark.rb: 309) Rendered profiles/edit.html.erb within layouts/application (15.1ms) Completed 200 OK in 215ms (Views: 23.5ms | ActiveRecord: 0.9ms)
It could be something obvious given I am relatively new to rails!
Thank you!