Użycie date_select daje 3 oddzielne pary klucz/wartość odpowiednio dla dnia, miesiąca i roku. Możesz więc przekazać je do Date.new
jako parametry do utworzenia nowego obiektu Date.
Przykładem date_select powrócił params dla Event
modelu
"event"=>
{"name"=>"Birthday",
"date(1i)"=>"2012",
"date(2i)"=>"11",
"date(3i)"=>"28"},
Następnie, aby utworzyć nowy Date
obiektu:
event = params[:event]
date = Date.new event["date(1i)"].to_i, event["date(2i)"].to_i, event["date(3i)"].to_i
może zamiast decydować się owinąć tę logikę w metodzie:
def flatten_date_array hash
%w(1 2 3).map { |e| hash["date(#{e}i)"].to_i }
end
A następnie nazwij to jako date = Date.new *flatten_date_array params[:event]
. Ale to nie jest logika, która naprawdę należy do kontrolera, więc możesz zdecydować, aby przenieść ją gdzie indziej. Możesz nawet rozszerzyć to na klasę Date
i nazwać ją jako date = Date.new_from_hash params[:event]
.
Bardzo zaskakujące, że Railsy nie zawierają prostego mechanizmu konwersji, ponieważ mają już ukryty mechanizm, gdy dołączanie daty wybierze model. Znalazłem w dokumentacji Rails Guides, że sugerują użycie 'Date.civil', jaka jest różnica między tym a' Date.new'? –
@at. Według dokumentów ruby, 'Date.civil' i' Date.new' są całkowicie identyczne. Zawsze używałem 'Date.new' jako jej więcej OOP-owski. I tak, zgadzam się z tobą, byłem również zaskoczony, że nie jest wbudowany w szyny. Ale prosta metoda 1-liniowa, taka jak powyższa, jest łatwa do naprawienia. – joofsh
nie brzmi zbyt trudne do wdrożenia jako część torów – BKSpurgeon