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!
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.
Ok! I have just found where the problem was! I had some additional validations written in my PortalUser model and it was updating because I wasn''t filling all the necessary fields. On Feb 14, 2:04 am, Amokrane <amokrane.chen...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> 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!-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.