Вопрос по date, routes, ruby-on-rails-3 – Рельсовые маршруты с датами

5

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

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

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

<code>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
</code>

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

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

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

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

Полагаю, тогда я перенесу свой ответ в поле фактического ответа. ;) Christopher WJ Rueber
Нет, это полностью личный проект, это как программирование, так и реальная проблема. DVG
Есть ли причина, по которой он должен быть читаемым человеком, и в таком формате? Будет ли более разумно настроить его как match & quot; events / (: date) & quot; где: дата заканчивается как "2012-05-01" и вы можете сделать прямое strftime на это в объекте реальной даты? Christopher WJ Rueber

Ваш Ответ

1   ответ
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

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

start_date = Date.today unless defined? start_date

Вы могли бы даже свернуть эти два последних вместе:

start_date = defined?(params[:date]) ? params[:date].strftime("%Y-%m-%d').to_date : Date.today
Также обратите внимание, что вы можете перейти непосредственно к дате, используя следующий синтаксис: Date.strptime (params [: date], '% Y-% m-% d')
Интересно, можете ли вы использовать косые черты в части самого параметра, не разбивая части на отдельные переменные? DVG
Я не уверен. Мое предположение - да, но я бы не рекомендовал это, потому что это несколько двусмысленно. Ваш маршрут будет читать & quot; события / (: дата) & quot; и вы "получаете" events / 2012/05/01 ". На мой взгляд, это выглядит немного грязно, поскольку предполагается, что вы делитесь на / в маршруте.
Итак, я начал играть с этим, и мне пришлось изменить маршрут на / events / week / (: date), потому что исходный коллизировался со стандартным маршрутом show RESTful. DVG

Похожие вопросы