andrew.ohnstad-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
2007-Mar-09 22:00 UTC
How are error_messages_for sorted?
This problem is driving me crazy... I''ve implemented the Ruby Cookbook method of user accounts. I''ve got the following code in my user model... validates_presence_of :username, :message => "can''t be blank" validates_uniqueness_of :username, :message => "is already taken!" validates_length_of :username, :maximum => 21, :message => "must be less than 21 characters" validates_confirmation_of :password, :if => lambda { |user| user.new_record? or not user.password.blank? } validates_length_of :password, :within => 6..20, :if => lambda { |user| user.new_record? or not user.password.blank? }validates_presence_of :gender, :message => "must be selected"validates_acceptance_of :tos, :message => "must be accepted by checking the box" validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a- z]{2,})$/i And the following in my new user add page... <%= error_messages_for ''user'' %> <%= form_tag :action => ''add'' %> Desired Username: <%= text_field "user", "username" %><br> Valid Email Address: <%= text_field "user", "email" %><br> Password (6 to 20 characters): <%= password_field "user", "password" %><br> Verify Password: <%= password_field "user", "password_confirmation" %><br> Please Choose a Gender<br><%= radio_button("user", "gender", "m") %>Male <%= radio_button("user", "gender", "f") %>Female <p><%=check_box("user", "tos") %> I am at least 18 years old. I have read and agree to the <%= link_to "Terms Of Service", :controller => "about", :action => "tos" %>.</p> <%= image_submit_tag("signup.gif")%> <%= end_form_tag %> Here is the problem. If someone submits a form with errors, the error messages are presented in a different order than I would expect. For example, if someone submits a blank form, they get back: There were problems with the following fields: Tos must be accepted by checking the box Username can''t be blank Gender must be selected Password is too short (minimum is 6 characters) Email is invalid This doesn''t follow the order in the model, the order of the form, or any logical order I can figure out. I really want the errors displayed in the same order that they appear on the form. Any ideas? I did search the group and learned I can step through the errors manually, using error_message_on :user, :username error_message_on :user, :email But this doesn''t seem very agile... if I add a field to the form later, then I''ll need to update the error_message_on section too. Why doesn''t rails display the errors in the same order as the validations in the model? --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
On 9 Mar 2007, at 22:00, andrew.ohnstad-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org wrote: [snip]> This doesn''t follow the order in the model, the order of the form, or > any logical order I can figure out.That''s because the errors are stored in a hash and "the order in which keys and/or values are returned by the various iterators over hash contents may seem arbitrary and will generally not be in insertion order." (Quotation from the Pickaxe book.)> I really want the errors > displayed in the same order that they appear on the form. Any ideas? > I did search the group and learned I can step through the errors > manually, using error_message_on :user, :username > error_message_on :user, :emailI agree -- it would indeed be simpler for the user if the errors displayed in the same order as the relevant form elements.> But this doesn''t seem very agile... if I add a field to the form > later, then I''ll need to update the error_message_on section too. Why > doesn''t rails display the errors in the same order as the validations > in the model?You seem to be suggesting a convention where the order of validation declarations in the model matches the order of form elements in your view. I''m not sure that''s optimal...what happens if you have two views of the same model with fields in a different order? This post and plugin may help you out (though as I write this I can only view the page via Google''s cache): http://www.railtie.net/articles/2006/01/26/enhancing_rails_errors Regards, Andy Stewart --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---