select_date

Witam

mam w formularzu pole date_select oraz dodałem walidacje gdzie sprawdzam format daty, samo validates_presence_of puszczało niepełną date

<%= f.date_select(:date, { :start_year => Date.today.year - 17, :end_year => 1900, :order => [:day, :month, :year], :prompt => {:day => 'Dzień', :month => 'Miesiąc', :year => 'Rok'}, :use_month_names => User::MONTHS }) %></p>

validates_format_of :date, :with => /^[0-9]{4}[-][0-9]{2}[-][0-9]{2}$/,  :message => "podaj date"

wydaje sie ze powinno działać jak trzeba a jednak gdy wybiorę tylko dzień (np 15) i wyśle formularz to przechodzi walidacje i do bazy trafia data 0015-01-01, nie bardzo wiem skąd woził sie rok 0015 skoro nie był wybrany a zakres to 1900…1992

Oczywiście jeśli wybiorę 15 luty 1999 to do bazy trafia poprawnie 1999-02-15

mam wiec gorącą prośbe o rady jak ujarzmić select_date lub podpowiedz czym go zastąpić

Może lepiej skorzystać z validates_inclusion_of?

validates_inclusion_of :date, :in => Date.new(1990)..Date.new(2010)

Wydaje mi się, że błędne wartości są również w parametrach :start_year i :end_year. Mam też dziwne wrażenie, że Twoje pole w bazie ma typ inny niż date lub datetime (varchar?).

pole w bazie napewno jest typu date

t.column :date,            :date

parametry :start_year i :end_year również poprawnie generuja opcje

[code]

Rok 1992 1991

.
.
.

1901 1900 [/code] nie wiem jak zastosować validates_inclusion_of bo chyba jako zbiór musiałbym sprawdzać całą date a nie tylko rok

http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_inclusion_of

Walidator ten nie sprawdza samego roku. Sprawdza, czy atrybut znajduje się w podanym przedziale, tablicy, itp.

code=ruby.include?(Date.today)
#=> true[/code]
BTW, dokumentacja klasy Date jest dość mocno zakręcona, okazuje się, że new jest aliasem metody civil:
http://apidock.com/ruby/DateTime/civil/class
Generalnie jeśli nie podasz miesiąca i dnia to domyślnie jest to pierwszy stycznia.

edit: co do parametrów :start_date i :end_date, które podałeś: na moje oko jest to przedział 1992…1900.

Nie wiem dalczego ale jak testowałem wczesniej

validates_inclusion_of :date, :in => Date.new(1990)..Date.new(2010)

to sypało błędami, ale teraz działa wpożądku :slight_smile: Dzieki !

Jednak sypie błędami ale dość dziwnie,

Gdy ustawie tylko dzień i miesiąc ( tylko niektóre daty ) dostaje

1 error(s) on assignment of multiparameter attributes

C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:3061:in execute_callstack_for_multiparameter_attributes' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:3022:inassign_multiparameter_attributes’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2749:in attributes=' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2439:ininitialize’
G:/Agile/podkupuj/app/controllers/users_controller.rb:55:in new' G:/Agile/podkupuj/app/controllers/users_controller.rb:55:increate’

wychwyciłem kiedy wywala mi błąd

gdy wybieram dzień z zakresu 13…31 i miesiąc (dowolny) dostaje błąd
[color=gray]
1 error(s) on assignment of multiparameter attributes

C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:3061:in execute_callstack_for_multiparameter_attributes' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:3022:inassign_multiparameter_attributes’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2749:in attributes=' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2439:ininitialize’
G:/Agile/podkupuj/app/controllers/users_controller.rb:55:in new' G:/Agile/podkupuj/app/controllers/users_controller.rb:55:increate’

[/color]

w każdej innej kombinacji wysyła poprawnie formularz. Jedynie co przychodzi mi na myśl to to ze z jakiegoś powodu dni “zachowują” się jak miesiące puszcza zakres 1…12 ale w oby przypadkach parametry są dobrze przyporządkowane

Parameters: {“user”=>{ “date(1i)”=>"", “date(2i)”=>“4”, “date(3i)”=>“15”, “password_confirmation”=>"", “password”=>""}, “commit”=>“Dalej”, “authenticity_token”=>“7sPH1JoqXfiKDFyevl03yW0vY3J3p6lBKLPvGArv1os=”}

ActiveRecord::MultiparameterAssignmentErrors (1 error(s) on assignment of multiparameter attributes):

<%= f.date_select(:date, {:start_year => 1992, :end_year => 1900, :order => [:day,:month,:year], :include_blank => true}) %>

Może spróbujesz jednak poprawić te parametry :start_year i :end_year?

Poprawić, tz. w te sposób ?

<%= f.date_select(:date, {:start_year => 1900, :end_year => 1992, :order => [:day,:month,:year], :include_blank => true}) %>
jesli tak to nie pomaga

Napisz jeszcze która wersja RoR i Rubiego, jak będę miał chwilę to postaram się to sprawdzić. W tym momencie nic innego mi nie przychodzi do głowy.

ruby 1.8.6 rails 2.3.2

dzięki za chęci