Given the following code:
class MyClass < ActiveRecord::Base
has_many :technical_contacts
has_many :schedule_contacts
validates_associated :technical_contacts, :schedule_contacts
protected
def validate
validate_contacts(technical_contacts)
validate_contacts(schedule_contacts)
end
private
def validate_contacts(contacts)
contacts.each_with_index{|contact, i|
(i+1).upto(contacts.length-1) do |j|
if contacts[j].email == contact.email
contacts[j].errors.add(:email,
''You have already provided this email
address'')
end
end
}
end
end
If my validate_contacts method adds errors to some contact objects, I
would expect @myclass.save to fail but it does not. I have tested that
the objects are invalid using the "valid?" method and they are so I
don''t understand what is going wrong. Can anyone please help?
--
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
-~----------~----~----~----~------~----~------~--~---
Craig Nicoll wrote:> Given the following code: > > class MyClass < ActiveRecord::Base > > has_many :technical_contacts > has_many :schedule_contacts > > validates_associated :technical_contacts, :schedule_contacts > > protected > > def validate > validate_contacts(technical_contacts) > validate_contacts(schedule_contacts) > end > > private > > def validate_contacts(contacts) > contacts.each_with_index{|contact, i| > (i+1).upto(contacts.length-1) do |j| > if contacts[j].email == contact.email > contacts[j].errors.add(:email, > ''You have already provided this email > address'') > end > end > } > end > > end > > If my validate_contacts method adds errors to some contact objects, I > would expect @myclass.save to fail but it does not. I have tested that > the objects are invalid using the "valid?" method and they are so I > don''t understand what is going wrong. Can anyone please help?Custom "validate" methods run after all other validations, so validates_associated will run before the contact errors are added. You can either get rid of the validates_associated call and add the base errors in the validate_contacts method, or move the validate_contacts calls to a :validates_each call that is placed before the validates_associated call. -- 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 -~----------~----~----~----~------~----~------~--~---
> Mark Reginald James wrote: > You can either get rid of the validates_associated call and add > the base errors in the validate_contacts method, or move the > validate_contacts calls to a :validates_each call that is > placed before the validates_associated call.>Hi Mark, I tried your suggestion but the save method is still working when it shouldn''t. Here is my code: class MyClass < ActiveRecord::Base has_many :technical_contacts has_many :schedule_contacts validates_each :technical_contacts do |model, attr, value| value.each_with_index{|contact, i| (i+1).upto(value.length-1) do |j| if value[j].email == contact.email value[j].errors.add(:email, ''You have already provided this email address'') end end } end validates_associated :technical_contacts, :schedule_contacts end Any help would be most appreciated. Thanks, Craig -- 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 -~----------~----~----~----~------~----~------~--~---
Craig Nicoll wrote:> I tried your suggestion but the save method is still working when it > shouldn''t. Here is my code: > > class MyClass < ActiveRecord::Base > > has_many :technical_contacts > has_many :schedule_contacts > > validates_each :technical_contacts do |model, attr, value| > value.each_with_index{|contact, i| > (i+1).upto(value.length-1) do |j| > if value[j].email == contact.email > value[j].errors.add(:email, > ''You have already provided this email > address'') > end > end > } > end > > validates_associated :technical_contacts, :schedule_contacts > > endWith what you have the error messages you add to a contact in the validates_each will be cleared before valid? is called on each of them during the validates_associated. Is something like this possible? class Contact < ActiveRecord::Base validates_uniqueness_of :email, :scope => :my_class_id, :message => ''^You have already provided this email address'' end class TechnicalContact < Contact end class ScheduleContact < Contact end class MyClass < ActiveRecord::Base has_many :technical_contacts has_many :schedule_contacts validates_associated :technical_contacts, :schedule_contacts end Otherwise, drop the validates_associated: validates_each :technical_contacts, :schedule_contacts do |m, a, v| v.each_with_index{ |contact, i| (i+1).upto(v.length-1) do |j| if value[j].email == contact.email value[j].errors.add(:email, ''Email already provided'') m.errors.add_to_base(a, ''Bad contact email address'') end end } end -- 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 -~----------~----~----~----~------~----~------~--~---