2012-05-02 17 views
5

Mam więc tygodniowy widok kalendarza i mam skonfigurowaną trasę do akceptowania /: rok /: miesiąc /: dzień dla daty początkowej.Szyny z datami

match "events/(:year/:month/:day)" => "events#index", 
     :constraints => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ }, 
     :as => "events_date" 

Mam dwa pytania dotyczące korzystania z tej trasy. Po pierwsze, podczas analizowania params, to co robię:

unless params[:year].nil? || params[:month].nil? || params[:day].nil? 
    start_date = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i) 
end 
start_date = start_date.nil? ? Date.today : start_date 

To wydaje mi się dość rozwlekły i rodzaj brzydki. Czy istnieje lepszy sposób?

I przy podejmowaniu link do innego tygodnia w kalendarzu (dla stronicowania tygodnia na tydzień), muszę coś zrobić jak

#assume an date object with the desired start date 
link_to events_date_path(date.strftime('%Y'), date.strftime('%m'), date.strftime('%d')) 

który wydaje również rodzaj gadatliwym i brzydkie. Jaki jest najlepszy sposób pracy z datami na trasach?

+0

Czy istnieje powód, dla którego musi być czytelny dla człowieka iw tym formacie? Czy byłoby rozsądniej ustawić go jako dopasowanie "events/(: date)" gdzie: data kończy się na byciu "2012-05-01" i możesz zrobić bezpośredni strftime na obiekcie daty rzeczywistej? –

+0

Nie, to jest całkowicie osobisty projekt, jest to zarówno programowanie, jak i prawdziwy problem. – DVG

+0

Przypuszczam, że wezmę moją odpowiedź do pola odpowiedzi. ;) –

Odpowiedz

8

Moja sugestia polegałaby na tym, aby nie używać trzech oddzielnych zmiennych. W ten sposób nie otrzymasz wielu dodatkowych sprawdzeń zerowych i sprawdzania poprawności w kontrolerze. Można włączyć dopasowanie do czegoś wyglądać tak, ze swoimi ograniczeniami nadal w takt:

match "events/(:date)" => "events#index", 
     :constraints => { :date => /\d{4}-\d{2}-\d{2}/ }, 
     :as => "events_date" 

Zatem byłoby skończyć z czymś trochę bardziej sane w kontrolerze:

unless params[:date] 
    start_date = params[:date].strftime("%Y-%m-%d').to_date # assuming you want a Date 
end 

i ja zwykle zrobić te rodzaje „jeśli jest ustawiony” sprawdza coś bardziej jak to, ponieważ uważam ją nieco bardziej czytelny:

start_date = Date.today unless defined? start_date 

można nawet toczyć te dwa ostatnie razem:

start_date = defined?(params[:date]) ? params[:date].strftime("%Y-%m-%d').to_date : Date.today 
+0

Pamiętaj też, że możesz przejść bezpośrednio do daty, używając następującej składni: Date.strptime (parametry [: date], '% Y-% m-% d') –

+0

Co Cię interesuje, czy możesz użyć ukośników w linii samego paramu bez rozbijania części na oddzielne zmienne? – DVG

+0

Nie jestem pozytywny. Zgaduję, że tak, ale nie poleciłbym tego, ponieważ jest nieco niejednoznaczny. Twoja trasa będzie czytać "events/(: date)" i otrzymujesz "events/2012/05/01". Moim zdaniem, po prostu czuje się trochę brudno, ponieważ ma się dzielić na trasie. –