Hi, How can I validate date in model class Thanks. Sainaba. -- Posted via http://www.ruby-forum.com/.
> How can I validate date in model class > > Thanks. > > Sainaba.Hi Sainaba, Did you ever find an answer to this? I''m also searching for a way to (for example) validate bad dates such as February 31st, 2006. Anyone got a tip? -- Posted via http://www.ruby-forum.com/.
Sean Schertell wrote:>>How can I validate date in model class >> >>Thanks. >> >>Sainaba. > > > Hi Sainaba, > > Did you ever find an answer to this? I''m also searching for a way to > (for example) validate bad dates such as February 31st, 2006. Anyone > got a tip?Date.valid_date? 2006,2,14 => 2453781 # Julian day number Date.valid_date? 2006,2,31 => nil -- Alex
This code will work in the model unless you are using date_select on the form. validates_each( :date ) do |record, name| value = record.send("#{name}_before_type_cast".to_sym) unless value.nil? || value.empty? Date.parse(value) rescue record.errors.add(name, "date is not valid") end end In the letter case nothing will work except of this solution http://wrath.rubyonrails.org/pipermail/rails/2005-March/004619.html. How ever I view Ara T Howard solution as a "fix to the immediate problem" rather then final solution. hope it helps. jan -- Posted via http://www.ruby-forum.com/.
Has anyone ever tweaked the standard date controls to ban dates like 30th february ? As standard, if you enter 30th february , it goes through quietly (no errors) as 2nd march. I''ve rummaged around in the source code, but so far I''ve been unable to discover the process that magically transforms the six separate bits of a form date-time field back into a single date when the form is submitted. I''d guess that finding that process is key to fixing the problem. TIA, Andy -- Posted via http://www.ruby-forum.com/.
I just use the standard library''s date validation within the model''s validate method. -- -- Tom Mornini On Jan 30, 2006, at 11:10 AM, rails nut wrote:> Has anyone ever tweaked the standard date controls to ban dates like > 30th february ? > > As standard, if you enter 30th february , it goes through quietly (no > errors) as 2nd march. > > I''ve rummaged around in the source code, but so far I''ve been > unable to > discover the process that magically transforms the six separate > bits of > a form date-time field back into a single date when the form is > submitted. I''d guess that finding that process is key to fixing the > problem. > > TIA, Andy > > > > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails
Open up ActiveRecord::Base and look for the attribute= method. Its starts there. Bob -----Original Message----- From: rails-bounces@lists.rubyonrails.org [mailto:rails-bounces@lists.rubyonrails.org] On Behalf Of rails nut Sent: Monday, January 30, 2006 11:10 AM To: rails@lists.rubyonrails.org Subject: [Rails] Date validation Has anyone ever tweaked the standard date controls to ban dates like 30th february ? As standard, if you enter 30th february , it goes through quietly (no errors) as 2nd march. I''ve rummaged around in the source code, but so far I''ve been unable to discover the process that magically transforms the six separate bits of a form date-time field back into a single date when the form is submitted. I''d guess that finding that process is key to fixing the problem. TIA, Andy -- Posted via http://www.ruby-forum.com/. _______________________________________________ Rails mailing list Rails@lists.rubyonrails.org http://lists.rubyonrails.org/mailman/listinfo/rails
rails nut writes:> Has anyone ever tweaked the standard date controls to ban dates like > 30th february ? > > As standard, if you enter 30th february , it goes through quietly (no > errors) as 2nd march.Tom Mornini <tmornini@...> writes:> > I just use the standard library''s date validation > within the model''s validate method. >If Rails automatically converts a ''bad'' date into it''s equivalent ''good'' date, wouldn''t the model''s validation method always see a valid date? At what point in the object''s life cycle does ''Feb 30'' or ''June 31'' get translated into ''March 2'' and ''July 1''?>From the descriptions, it seems that rails nut''s app is happily chugging alongwhen weird dates are entered, while Tom''s models raise a validation error. I''m assuming, of course, that if rails nut added date validation to the method, it would also barf on a weird date, meaning that validation is the way to handle this issue. However, if the bad dates go through even with validation, then that is something different... ...Isn''t it? I''m a n00b t00, so this is more of a "verifiying my knowledge" than a "this is the answer."
To clarify what''s happening: User has a form to create new object which has scaffolded code for a date field. User selects feb 30th and hits submit on the form. New object is created by rails with no validation errors, but the date comes back as march 2nd. I would like feb 30th to raise an error somehow, preferably in validation at the model layer, but I haven''t yet found out how to do date validation. Andy -- Posted via http://www.ruby-forum.com/.
Tom Mornini wrote:> I just use the standard library''s date validation > within the model''s validate method. > > -- > -- Tom MorniniI can''t see anything for date validation in the rails book or the ruby book. Can you tell me what you mean by ''standard library date validation'' please ? Andy -- Posted via http://www.ruby-forum.com/.
On Jan 31, 2006, at 2:20 AM, rails nut wrote:> Tom Mornini wrote: >> I just use the standard library''s date validation >> within the model''s validate method. >> >> -- >> -- Tom Mornini > > I can''t see anything for date validation in the rails book or the ruby > book. Can you tell me what you mean by ''standard library date > validation'' please ?Sorry for the long delay on this. The talk of Rails returning dates that don''t match the input rather surprised me. I''ve been working on tests and backend work almost exclusively, so I wanted to investigate this for myself completely before discussing it further. OK, I have a form that allows date input, and on submit I get this in the logs: Parameters: {"buyer"=>{"born_on(1i)"=>"1988","born_on (2i)"=>"2","born_on(3i)"=>"31"}, "commit"=>"Create"} I can access the buyer.born_on field, as you''ve been discussing, but I can also access: params[:buyer][''born_on(1i)''] -> 1988 params[:buyer][''born_on(2i)''] -> 2 params[:buyer][''born_on(3i)''] -> 31 Which can be tested with this application.rb method: def test_date(object,attribute) Date.valid_civil?(params[object][attribute + ''(1i)''].to_i, params[object][attribute + ''(2i)''].to_i, params[object][attribute + ''(3i)''].to_i) end by writing: def valid test_date(:buyer,''born_on'') end -- -- Tom Mornini
Tom Mornini wrote: ...> > Which can be tested with this application.rb method: > > def test_date(object,attribute) > Date.valid_civil?(params[object][attribute + ''(1i)''].to_i, > params[object][attribute + ''(2i)''].to_i, > params[object][attribute + ''(3i)''].to_i) > end > > by writing: > > def valid > test_date(:buyer,''born_on'') > end > > -- > -- Tom MorniniThat''s pretty close to what I did in the end, except your code parameterises the field name to be checked, and I manually wrote the bans on feb 30 etc (''cos I didn''t know date.valid_civil? existed). I will probably re-factor based on your code ... many thanks. Andy -- Posted via http://www.ruby-forum.com/.
But that only lets you validate the date at the controller level. What if you want to perform validation at the model level, and from what I gather is the Rails way of doing things? The point the previous posters have been making is that by the time the date is available for validation in the model it has already been coerced into a valid format by rails so any attempt to validate it will succeed. I''ve put together a simple form that contains among other things a date_select: <%= date_select(:user, :dob, :order => [:day, :month, :year], :start_year => 1900, :end_year => Date.today.year) %> In my controller I have some code to create a user entity from the parameters posted up from the form, like so: parameters: {"user"=>{"dob(1i)"=>"2006", "dob(2i)"=>"2", "dob(3i)"=>"31"}} @user = User.new(params[:user]) As if by magic Rails will convert dates like 31/02/2006 into 03/03/2006 so at the model level ''user.dob'' => ''03/03/2006''. Are you supposed to refrain from constructing model objects using the above technique when dates are involved? regards, Cathal. Tom Mornini wrote:> On Jan 31, 2006, at 2:20 AM, rails nut wrote: > >> Tom Mornini wrote: >>> I just use the standard library''s date validation >>> within the model''s validate method. >>> >>> -- >>> -- Tom Mornini >> >> I can''t see anything for date validation in the rails book or the ruby >> book. Can you tell me what you mean by ''standard library date >> validation'' please ? > > Sorry for the long delay on this. > > The talk of Rails returning dates that don''t match the > input rather surprised me. I''ve been working on tests > and backend work almost exclusively, so I wanted to > investigate this for myself completely before discussing > it further. > > OK, I have a form that allows date input, and on submit > I get this in the logs: > > Parameters: {"buyer"=>{"born_on(1i)"=>"1988","born_on > (2i)"=>"2","born_on(3i)"=>"31"}, "commit"=>"Create"} > > I can access the buyer.born_on field, as you''ve been discussing, but > I can also access: > > params[:buyer][''born_on(1i)''] -> 1988 > params[:buyer][''born_on(2i)''] -> 2 > params[:buyer][''born_on(3i)''] -> 31 > > Which can be tested with this application.rb method: > > def test_date(object,attribute) > Date.valid_civil?(params[object][attribute + ''(1i)''].to_i, > params[object][attribute + ''(2i)''].to_i, > params[object][attribute + ''(3i)''].to_i) > end > > by writing: > > def valid > test_date(:buyer,''born_on'') > end > > -- > -- Tom Mornini-- Posted via http://www.ruby-forum.com/.
Was there any ever resolution with this? I am having the same exact problem and would really prefer to not have to put validation logic in my controller. Sean -- 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 -~----------~----~----~----~------~----~------~--~---