Hi,
I''m having a weird validation issue. Validation isn''t working
for
certain attributes and, for some reason, it''s also affecting things
outside of validation.
For campers on certain camp types, we require some information about
their school. I tried to validate the information this way:
validates_presence_of :school_type, :if => Proc.new { |c|
!c.booking.nil? and ( c.booking.camp.camptype == Camptype.find(:first,
:conditions => [ ''name = ?'', "Children''s
Camp"]) or
c.booking.camp.camptype == Camptype.find(:first, :conditions => [
''name = ?'', ''Adventure Camp'']) ) }
validates_presence_of :school_year, :if => Proc.new { |c|
!c.booking.nil? and ( c.booking.camp.camptype == Camptype.find(:first,
:conditions => [ ''name = ?'', "Children''s
Camp"]) or
c.booking.camp.camptype == Camptype.find(:first, :conditions => [
''name = ?'', ''Adventure Camp'']) ) }
validates_presence_of :school_name, :if => Proc.new { |c|
!c.booking.nil? and ( c.booking.camp.camptype == Camptype.find(:first,
:conditions => [ ''name = ?'', "Children''s
Camp"]) or
c.booking.camp.camptype == Camptype.find(:first, :conditions => [
''name = ?'', ''Adventure Camp'']) ) }
but for some reason, that meant I could no longer add camps. (I wasn''t
getting a syntax error either).
I then changed the validation code to this:
if !self.booking.nil? and !self.booking.camp.nil? and (
self.booking.camp.camptype == Camptype.find(:first, :conditions => [
''name = ?'', "Children''s Camp"]) or
self.booking.camp.camptype =Camptype.find(:first, :conditions => [
''name = ?'', ''Adventure Camp''])
)
if self.school_type.blank?
errors.add(:school_type, ''must be provided.'')
elsif !Camper::SCHOOL_TYPES.include?(self.school_type)
errors.add(:school_type, ''is invalid.'')
end
if self.school_year.blank?
errors.add(:school_type, ''must be provided.'')
end
if self.school_name.blank?
errors.add(:school_type, ''must be provided.'')
end
end
but that had exactly the same effect.
Interestingly enough, it got through the code to the exact same point
as it would if it had actually added the camper to the booking.
Looking at the DB, the camper record was there but didn''t have
anything for contact_id or booking_id.
if !camper_already_attending && @contact.save &&
@camper.valid? &&
(@camper.contact = @contact) # (Yes, that last equal should
definitely be a single one!)
unless @booking.contactslist.include?( @contact.id )
# Need to add a role of "SU Camper" to the contact here
camper_role = Role.find(:first, :conditions => "name =
''SU Camper''")
@contact.add_role(camper_role)
camper_added = false
particular_error = ''''
if @booking.camp.camptype == Camptype.find(:first, :conditions
=> [ ''name = ?'', ''Parenting Camp'' ] )
if @booking.campers.size == 2
particular_error = ''The booking is already full.''
else
@booking.campers << @camper
camper_added = true
end
else
@booking.campers << @camper
camper_added = true
end
if @note.save
@camper.add_note(@note)
end
if !camper_added
@camper.destroy
flash[:warning] = ''Camper could not be added to the booking:
'' + particular_error
redirect_to :action => ''showbooking'', :id =>
@booking
elsif @camper.child? and !(@camper.booking.nil? or
@camper.booking.camp.camptype == Camptype.find(:first, :conditions =>
[ ''name = ?'', ''Parenting Camp'']) or
@camper.booking.camp.camptype =Camptype.find(:first, :conditions => [
''name = ?'', ''Family Camp'']) )
and @camper.guardian.nil?
flash[:notice] = ''Camper record saved.''
redirect_to :action => ''addguardian'', :id =>
@booking,
:camper => @camper
else
# THIS IS WHERE IT GOT TO
flash[:notice] = ''Camper was successfully added to the
booking.''
if @booking.camp.within_age_range?(@camper)
redirect_to :action => ''showbooking'', :id =>
@booking,
:highlight => @camper.id
else
redirect_to :action => ''alert_outside_age'', :id
=> @camper.id
end
end
else
flash[:warning] = ''The camper '' + @contact.name +
'' is already
on the booking.''
redirect_to :action => ''showbooking'', :id =>
@booking
end
else
if camper_already_attending
flash[:warning] = ''Sorry, that camper is already attending the
camp.''
redirect_to :action => ''showbooking'', :id =>
@booking
else
render :action => ''addcamper'', :layout =>
''layouts/manualbooking''
end
end
If I remove the validation code, everything else works fine.
Any ideas? I''m stumped!
Dave
--
Site: http://antidis.com/
Does anyone have any ideas? Dave On 2/8/06, David Barrett <david.barrett@gmail.com> wrote:> Hi, > > I''m having a weird validation issue. Validation isn''t working for > certain attributes and, for some reason, it''s also affecting things > outside of validation. > > For campers on certain camp types, we require some information about > their school. I tried to validate the information this way: > > validates_presence_of :school_type, :if => Proc.new { |c| > !c.booking.nil? and ( c.booking.camp.camptype == Camptype.find(:first, > :conditions => [ ''name = ?'', "Children''s Camp"]) or > c.booking.camp.camptype == Camptype.find(:first, :conditions => [ > ''name = ?'', ''Adventure Camp'']) ) } > validates_presence_of :school_year, :if => Proc.new { |c| > !c.booking.nil? and ( c.booking.camp.camptype == Camptype.find(:first, > :conditions => [ ''name = ?'', "Children''s Camp"]) or > c.booking.camp.camptype == Camptype.find(:first, :conditions => [ > ''name = ?'', ''Adventure Camp'']) ) } > validates_presence_of :school_name, :if => Proc.new { |c| > !c.booking.nil? and ( c.booking.camp.camptype == Camptype.find(:first, > :conditions => [ ''name = ?'', "Children''s Camp"]) or > c.booking.camp.camptype == Camptype.find(:first, :conditions => [ > ''name = ?'', ''Adventure Camp'']) ) } > > but for some reason, that meant I could no longer add camps. (I wasn''t > getting a syntax error either). > > I then changed the validation code to this: > > if !self.booking.nil? and !self.booking.camp.nil? and ( > self.booking.camp.camptype == Camptype.find(:first, :conditions => [ > ''name = ?'', "Children''s Camp"]) or self.booking.camp.camptype => Camptype.find(:first, :conditions => [ ''name = ?'', ''Adventure Camp'']) > ) > > if self.school_type.blank? > errors.add(:school_type, ''must be provided.'') > elsif !Camper::SCHOOL_TYPES.include?(self.school_type) > errors.add(:school_type, ''is invalid.'') > end > > if self.school_year.blank? > errors.add(:school_type, ''must be provided.'') > end > > if self.school_name.blank? > errors.add(:school_type, ''must be provided.'') > end > > end > > but that had exactly the same effect. > > Interestingly enough, it got through the code to the exact same point > as it would if it had actually added the camper to the booking. > Looking at the DB, the camper record was there but didn''t have > anything for contact_id or booking_id. > > if !camper_already_attending && @contact.save && @camper.valid? && > (@camper.contact = @contact) # (Yes, that last equal should > definitely be a single one!) > unless @booking.contactslist.include?( @contact.id ) > # Need to add a role of "SU Camper" to the contact here > camper_role = Role.find(:first, :conditions => "name = ''SU Camper''") > @contact.add_role(camper_role) > camper_added = false > particular_error = '''' > if @booking.camp.camptype == Camptype.find(:first, :conditions > => [ ''name = ?'', ''Parenting Camp'' ] ) > if @booking.campers.size == 2 > particular_error = ''The booking is already full.'' > else > @booking.campers << @camper > camper_added = true > end > else > @booking.campers << @camper > camper_added = true > end > > if @note.save > @camper.add_note(@note) > end > > if !camper_added > @camper.destroy > flash[:warning] = ''Camper could not be added to the booking: > '' + particular_error > redirect_to :action => ''showbooking'', :id => @booking > elsif @camper.child? and !(@camper.booking.nil? or > @camper.booking.camp.camptype == Camptype.find(:first, :conditions => > [ ''name = ?'', ''Parenting Camp'']) or @camper.booking.camp.camptype => Camptype.find(:first, :conditions => [ ''name = ?'', ''Family Camp'']) ) > and @camper.guardian.nil? > flash[:notice] = ''Camper record saved.'' > redirect_to :action => ''addguardian'', :id => @booking, > :camper => @camper > else > # THIS IS WHERE IT GOT TO > flash[:notice] = ''Camper was successfully added to the booking.'' > if @booking.camp.within_age_range?(@camper) > redirect_to :action => ''showbooking'', :id => @booking, > :highlight => @camper.id > else > redirect_to :action => ''alert_outside_age'', :id => @camper.id > end > end > > else > flash[:warning] = ''The camper '' + @contact.name + '' is already > on the booking.'' > redirect_to :action => ''showbooking'', :id => @booking > end > else > if camper_already_attending > flash[:warning] = ''Sorry, that camper is already attending the camp.'' > redirect_to :action => ''showbooking'', :id => @booking > else > render :action => ''addcamper'', :layout => ''layouts/manualbooking'' > end > end > > > If I remove the validation code, everything else works fine. > > Any ideas? I''m stumped! > > Dave > > -- > Site: http://antidis.com/ >-- Site: http://antidis.com/