2012-05-02 3 views
5

Итак, у меня есть еженедельный просмотр календаря, и у меня есть маршрут, настроенный для приема /: год /: месяц /: день для даты начала.Рельсы маршрутов с датами

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

У меня есть два вопроса относительно использования этого маршрута. Во-первых, при разборе Params, это то, что я делаю:

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 

Это кажется мне довольно многословен и вид некрасиво. Есть ли способ лучше?

И, делая ссылку на другую неделю в календаре (для подкачки недели в неделю), я должен сделать что-то вроде

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

Который также, кажется, своего рода многословным и некрасиво. Каков наилучший способ работы с датами в маршрутах?

+0

Есть ли причина, по которой он должен быть читаемым человеком и в этом формате? Было бы разумнее, если бы оно было настроено как совпадение «events/(: date)» где: дата заканчивается как «2012-05-01», и вы можете сделать прямой strftime на этом в настоящий объект даты? –

+0

Нет, это полностью личный проект, это столько же упражнений по программированию, что и настоящая проблема. – DVG

+0

Я полагаю, что тогда я отвечу на реальное поле ответа. ;) –

ответ

8

Мое предложение состояло бы в том, чтобы не использовать три отдельные переменные. Таким образом, вы не получите много лишней проверки и проверки работоспособности в вашем контроллере. Вы можете превратить ваш матч к чему-то выглядеть, как это, с ограничениями еще в такте:

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

Таким образом, вы в конечном итоге с чем-то немного более вменяемым в контроллере:

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

И I обычно делает эти типы «если это установлено» проверяет что-то больше похож на это, потому что я нахожу это немного более читаемое:

start_date = Date.today unless defined? start_date 

Можно даже свернуть эти последние двумя вместе:

+0

Обратите внимание, что вы можете перейти непосредственно к дате, используя этот синтаксис: Date.strptime (params [: date], '% Y-% m-% d') –

+0

Точка интереса, можете ли вы использовать косые черты в части самого парама, не разбивая части на отдельные переменные? – DVG

+0

Я не уверен. Я думаю, что да, но я бы не рекомендовал его, потому что это несколько неоднозначно. Ваш маршрут будет читать «события/(: дата)», и вы получаете «события/2012/05/01». На мой взгляд, это просто немного грязно, так как вы должны раскалываться на маршруте. –

Смежные вопросы