Manivannan J
2013-Mar-15 14:53 UTC
Rails 3 How to assign the value to nested attributes before calling save in update action
I am using Rails 3.0.9 and Ruby 1.9.2 Models associations are document.rb has_many :sections accepts_nested_attributes_for :sections, :allow_destroy => :true, :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } } section.rb belongs_to :document has_many :paragraphs, :dependent => :destroy has_many :contents :through => :paragraphs validates :user_id, :presence => { :message => "Must be filled" } paragraph.rb attr_accessible :user_id, :section_id, :content_id belongs_to :section belongs_to :content validates :user_id, :section, :content, :presence => { :message => "Must be filled" } paragraphs table just like a intermediate table for sections and contents and I want to save records in documents, sections and paragraphs table using single form submission. _form.html.erb <%= form_for @document, :validate => true do |f| %> <%= f.error_messages %> <div><%= f.text_field :name %></div> <% f.fields_for :sections do |builder| %> <div><%= builder.text_field :name %></div> <div><%= builder.select :content_ids, Content.all.collect {|p| [ p.name, p.id ] },{:prompt => "Please Select"}, {:class => "nhs_select", :multiple => true} %></div> <% end %> <%= f.submit :submit%> <% end %> Example parameters when submiting the form {"document"=>{"name"=>"sdf", "sections_attributes"=>{"0"=>{"name"=>"sdf", "description"=>"sdf", "_destroy"=>"0", "content_ids" => ["1", "2"]}}, "commit"=>"Create Document"} In additionally, I should need to update current_user''s id to user_id column of paragraphs table. def create @document = Document.new @document.attributes = params[:document] @document.sections.each {|section| section.user_id = current_user.id section.paragraphs.each {|paragraph| paragraph.user_id = current_user.id} } if @document.save! # success else render :action => ''new'' end end *Problem 1:* At first, I submit the form, rails render new form without error message even I have implemented code to display error messages. then again clicked submit button, action goes to update method. But it should go to new action. I inspected in console, the inserted records were rollbacked but still the ID is retain in object. Example: <form id="edit_document_6" class="edit_document" method="post" action="/documents/6" accept-charset="UTF-8"> *Problem 2:* Documentation said that the changes are not saved to the database when assigning the attributes as like user.attributes = {:name => “Rob”}. but my case validation is triggered when assigning the attributes so I can''t assign the value to user_id column in paragraph object before calling save method @document.attributes = {"sections_attributes"=>{"0"=>{"name"=>"sdf", "content_ids" => ["1", "2"]}} or section = Section.first section.attributes = {"content_ids" => ["1", "2"]} How to assign the value to *user_id* in paragraph object before calling save method -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/hTVkb1DL_LEJ. For more options, visit https://groups.google.com/groups/opt_out.
Manivannan J
2013-Mar-15 14:55 UTC
Re: Rails 3 How to assign the value to nested attributes before calling save in update action
Console output: Started POST "/documents" for 127.0.0.1 at 2013-03-15 19:17:12 +0530 Processing by DocumentsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"fvjouziWyDPCsTIJQvguXG1vvAIGy8ej5hR+69TTeIQ=", "document"=>{"name"=>"sample", "sections_attributes"=>{"0"=>{"name"=>"one", "content_ids"=>["1", "2"]}}}, "commit"=>"submit"} Content Load (0.0ms) SELECT `contents`.* FROM `contents` WHERE `contents`.`id` IN (1, 2) SQL (0.1ms) BEGIN SQL (0.0ms) COMMIT SQL (0.0ms) BEGIN SQL (0.3ms) describe `documents` AREL (0.1ms) INSERT INTO `documents` (`name`, `created_at`, `updated_at`) VALUES (''sample'', ''2013-03-15 13:47:12'', ''2013-03-15 13:47:12'') SQL (0.3ms) describe `sections` AREL (0.1ms) INSERT INTO `sections` (`name`, `document_id`, `created_at`, `updated_at`) VALUES (''one'', 2, ''2013-03-15 13:47:12'', ''2013-03-15 13:47:12'') Section Load (0.3ms) SELECT `sections`.* FROM `sections` WHERE `sections`.`id` = 3 LIMIT 1 Content Load (0.1ms) SELECT `contents`.* FROM `contents` WHERE `contents`.`id` = 1 LIMIT 1 SQL (72.5ms) ROLLBACK Content Load (0.1ms) SELECT `contents`.* FROM `contents` Rendered documents/_form.html.erb (4.8ms) Rendered documents/new.html.erb within layouts/application (8.7ms) Started POST "/documents/2" for 127.0.0.1 at 2013-03-15 19:17:48 +0530 Processing by DocumentsController#update as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"fvjouziWyDPCsTIJQvguXG1vvAIGy8ej5hR+69TTeIQ=", "document"=>{"name"=>"sample", "sections_attributes"=>{"0"=>{"name"=>"one", "content_ids"=>["1", "2"]}}}, "commit"=>"submit", "id"=>"2"} Document Load (0.2ms) SELECT `documents`.* FROM `documents` WHERE `documents`.`id` = 2 LIMIT 1 Completed 404 Not Found in 10ms ActiveRecord::RecordNotFound (Couldn''t find Document with ID=2): app/controllers/documents_controller.rb:30:in `update'' On Friday, March 15, 2013 8:23:31 PM UTC+5:30, Manivannan J wrote:> > I am using Rails 3.0.9 and Ruby 1.9.2 > > Models associations are > > document.rb > has_many :sections > accepts_nested_attributes_for :sections, :allow_destroy => :true, > :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } } > > section.rb > belongs_to :document > has_many :paragraphs, :dependent => :destroy > has_many :contents :through => :paragraphs > validates :user_id, :presence => { :message => "Must be filled" } > > paragraph.rb > attr_accessible :user_id, :section_id, :content_id > belongs_to :section > belongs_to :content > validates :user_id, :section, :content, :presence => { :message => > "Must be filled" } > > paragraphs table just like a intermediate table for sections and contents > and I want to save records in documents, sections and paragraphs table > using single form submission. > > _form.html.erb > > <%= form_for @document, :validate => true do |f| %> > <%= f.error_messages %> > <div><%= f.text_field :name %></div> > > <% f.fields_for :sections do |builder| %> > <div><%= builder.text_field :name %></div> > <div><%= builder.select :content_ids, Content.all.collect {|p| [ > p.name, p.id ] },{:prompt => "Please Select"}, {:class => "nhs_select", > :multiple => true} %></div> > <% end %> > <%= f.submit :submit%> > <% end %> > > > Example parameters when submiting the form > {"document"=>{"name"=>"sdf", > "sections_attributes"=>{"0"=>{"name"=>"sdf", "description"=>"sdf", > "_destroy"=>"0", "content_ids" => ["1", "2"]}}, "commit"=>"Create Document"} > > In additionally, I should need to update current_user''s id to user_id > column of paragraphs table. > > def create > @document = Document.new > @document.attributes = params[:document] > @document.sections.each {|section| > section.user_id = current_user.id > section.paragraphs.each {|paragraph| paragraph.user_id = > current_user.id} > } > if @document.save! > # success > else > render :action => ''new'' > end > end > > *Problem 1:* > > At first, I submit the form, rails render new form without error message > even I have implemented code to display error messages. > > then again clicked submit button, action goes to update method. But it > should go to new action. > > I inspected in console, the inserted records were rollbacked but still the > ID is retain in object. > > Example: <form id="edit_document_6" class="edit_document" method="post" > action="/documents/6" accept-charset="UTF-8"> > > *Problem 2:* > > Documentation said that the changes are not saved to the database when > assigning the attributes as like user.attributes = {:name => “Rob”}. > > but my case validation is triggered when assigning the attributes so I > can''t assign the value to user_id column in paragraph object before calling > save method > > @document.attributes = {"sections_attributes"=>{"0"=>{"name"=>"sdf", > "content_ids" => ["1", "2"]}} > or > section = Section.first > section.attributes = {"content_ids" => ["1", "2"]} > > How to assign the value to *user_id* in paragraph object before calling > save method > >-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/xOLlNQfRoi4J. For more options, visit https://groups.google.com/groups/opt_out.
Manivannan J
2013-Mar-15 14:56 UTC
Re: Rails 3 How to assign the value to nested attributes before calling save in update action
Console Output Started POST "/documents" for 127.0.0.1 at 2013-03-15 19:17:12 +0530 Processing by DocumentsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"fvjouziWyDPCsTIJQvguXG1vvAIGy8ej5hR+69TTeIQ=", "document"=>{"name"=>"sample", "sections_attributes"=>{"0"=>{"name"=>"one", "content_ids"=>["1", "2"]}}}, "commit"=>"submit"} Content Load (0.0ms) SELECT `contents`.* FROM `contents` WHERE `contents`.`id` IN (1, 2) SQL (0.1ms) BEGIN SQL (0.0ms) COMMIT SQL (0.0ms) BEGIN SQL (0.3ms) describe `documents` AREL (0.1ms) INSERT INTO `documents` (`name`, `created_at`, `updated_at`) VALUES (''sample'', ''2013-03-15 13:47:12'', ''2013-03-15 13:47:12'') SQL (0.3ms) describe `sections` AREL (0.1ms) INSERT INTO `sections` (`name`, `document_id`, `created_at`, `updated_at`) VALUES (''one'', 2, ''2013-03-15 13:47:12'', ''2013-03-15 13:47:12'') Section Load (0.3ms) SELECT `sections`.* FROM `sections` WHERE `sections`.`id` = 3 LIMIT 1 Content Load (0.1ms) SELECT `contents`.* FROM `contents` WHERE `contents`.`id` = 1 LIMIT 1 SQL (72.5ms) ROLLBACK Content Load (0.1ms) SELECT `contents`.* FROM `contents` Rendered documents/_form.html.erb (4.8ms) Rendered documents/new.html.erb within layouts/application (8.7ms) Started POST "/documents/2" for 127.0.0.1 at 2013-03-15 19:17:48 +0530 Processing by DocumentsController#update as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"fvjouziWyDPCsTIJQvguXG1vvAIGy8ej5hR+69TTeIQ=", "document"=>{"name"=>"sample", "sections_attributes"=>{"0"=>{"name"=>"one", "content_ids"=>["1", "2"]}}}, "commit"=>"submit", "id"=>"2"} Document Load (0.2ms) SELECT `documents`.* FROM `documents` WHERE `documents`.`id` = 2 LIMIT 1 Completed 404 Not Found in 10ms ActiveRecord::RecordNotFound (Couldn''t find Document with ID=2): app/controllers/documents_controller.rb:30:in `update'' -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/DeuptnFweogJ. For more options, visit https://groups.google.com/groups/opt_out.