NickCB
2008-Jan-20 21:21 UTC
Validation and error messages in has_many association in single form with parent
I am having trouble with validation and user-friendly error messages when I create a new "Spot" and an associated (has_many) "Title". I have the following models: --------------------------------------------------------------------- class Spot < ActiveRecord::Base has_many :titles, :dependent => :destroy, :conditions => "active = 1" validates_length_of :address, :in => 1..1000, :too_short => "The Address cannot be blank.", :too_long => "The Address needs to be less than %d characters" end class Title < ActiveRecord::Base belongs_to :spot validates_length_of :title, :in => 1..255, :too_short => "The Title cannot be blank.", :too_long => "The Title needs to be less than %d characters", :message => nil end Then in my new.html.ebr view I use multiple objects in error_messages_for to show both validation results, and I use fields_for to generate the Spot portion the form. ---------------------------------------------------------------------- error_messages_for (:object => [@spot.titles[0], @spot]) <% form_for(@spot) do |f| %> <% fields_for(@spot.titles[0]) do |t_form| %> <p> <b>Title</b><br /> <%= t_form.text_field :title %> </p> <% end %> <p> <b>Address</b><br /> <%= f.text_area :address %> </p> <p> <%= f.submit "Create" %> </p> <% end %> Here are the new and create actions in the Spots controller. ---------------------------------------------------------------------- def new @spot = Spot.new @spot.titles[0] = Title.new respond_to do |format| format.html # new.html.erb format.xml { render :xml => @spot } end end def create @spot = Spot.new(params[:spot]) @spot.titles[0] = Title.new(params[:title]) #set the new title @spot.titles[0].active = 1 respond_to do |format| if @spot.save flash[:notice] = ''Spot was successfully created.'' format.html { redirect_to(@spot) } format.xml { render :xml => @spot, :status => :created, :location => @spot } else format.html { render :action => "new" } format.xml { render :xml => @spot.errors, :status => :unprocessable_entity } end end end Everything works, but I am seeing a couple of strange things that I don''t really understand. First, the title is being validated, which is good, but I don''t have to include a validates_associated call in the Spot model like I would if this was a has_one relationship. Why is that? Second, when there is an error in the title field, error_messages_for (:object => [@spot.titles[0], @spot]) displays two errors, the first one is what I expect "The Title cannot be blank." but I also get an additional error "Titles is invalid." This error is part of the @spot object. I would like to be able to remove this message, because it is a duplicate, and because I don''t know where to change the verbiage to something more user friendly. Thanks for any information. Nick Carlevaris --~--~---------~--~----~------------~-------~--~----~ 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-Jan-21 06:23 UTC
Re: Validation and error messages in has_many association in single form with parent
NickCB wrote:> First, the title is being validated, which is good, but I don''t have > to include a validates_associated call in the Spot model like I would > if this was a has_one relationship. Why is that? > > Second, when there is an error in the title field, error_messages_for > (:object => [@spot.titles[0], @spot]) displays two errors, the first > one is what I expect "The Title cannot be blank." but I also get an > additional error "Titles is invalid." This error is part of the @spot > object. I would like to be able to remove this message, because it is > a duplicate, and because I don''t know where to change the verbiage to > something more user friendly.Active Record does automatic internal validation of has_many associations. You can turn it off by putting def validate_associated_records_for_titles() end after the has_many call. You can then add your own validates_associated call with your own error message. Call validates_associated with :message => nil if you want no error message displayed for the parent object. -- We develop, watch us RoR, in numbers too big to ignore. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
Worked like a charm. -- 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 -~----------~----~----~----~------~----~------~--~---