Hi there, You so you know, I''m fairly new to rails - I still have a lot learn. For fun I''m trying to create a forum in rails. I have some problems with the create method of the topic resource. I''ve set up a virtual attribute called text for topic, to use for mass assignment: In topics_controller.rb: @topic = Topic.new(params[:topic]) In topic.rb: def text=(text) posts.build(:text => text) end The topic model handles the text-attributes by building a post model through its association. This is pretty neat I think! It results in very readable and structured code. But when I try to save the topic with @topic.save it gives me the error that "Posts is invalid". This is because post.rb includes the following: validates_presence_of :topic_id When the validation are run (just before the topic is actually saved) rails also validates the children of the topic - that is the post model. As this post has not yet defined a topic_id its validations fail. The topic id will not be available until the topic is created in the database - and the topic will not be created in the database until the post validates - and the post will not validate until the topic id is defined. I hope you can see the cycle of dependencies. If I just remove validates_presence_of :topic_id it works like a charm. Rails even defines the posts topic id through the association set up with posts.build(). However, to me it seems like a "dirty" solution to the problem? What would you do here? Any recommendations/ideas? Thanks in advance. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Mark Reginald James
2008-Sep-04 00:02 UTC
Re: validates presence of foreign_key & auto child save
Rasmus Nielsen wrote:> Hi there, > > You so you know, I''m fairly new to rails - I still have a lot learn. > > For fun I''m trying to create a forum in rails. I have some problems with > the create method of the topic resource. I''ve set up a virtual attribute > called text for topic, to use for mass assignment: > > In topics_controller.rb: > @topic = Topic.new(params[:topic]) > > In topic.rb: > def text=(text) > posts.build(:text => text) > end > > The topic model handles the text-attributes by building a post model > through its association. > > This is pretty neat I think! It results in very readable and structured > code. But when I try to save the topic with @topic.save it gives me the > error that "Posts is invalid". This is because post.rb includes the > following: > validates_presence_of :topic_id > > When the validation are run (just before the topic is actually saved) > rails also validates the children of the topic - that is the post model. > As this post has not yet defined a topic_id its validations fail. > > The topic id will not be available until the topic is created in the > database - and the topic will not be created in the database until the > post validates - and the post will not validate until the topic id is > defined. > > I hope you can see the cycle of dependencies. > > If I just remove validates_presence_of :topic_id it works like a charm. > Rails even defines the posts topic id through the association set up > with posts.build(). However, to me it seems like a "dirty" solution to > the problem? > > What would you do here? Any recommendations/ideas? > > Thanks in advance.The usual solution is: class Topic def text=(text) # Rails should be setting the belongs-to object automatically here posts.build(:text => text, :topic => self) text # Make sure you return something that''s expected end end class Post validates_presence_of :topic end -- Rails Wheels - Find Plugins, List & Sell Plugins - http://railswheels.com --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---