2012-05-02 21 views
5

Tengo una vista de calendario semanal y tengo una ruta configurada para aceptar /: año /: mes /: día para la fecha de inicio.Rutas rutas con fechas

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

Tengo dos preguntas con respecto al uso de esta ruta. En primer lugar, al analizar los parametros, esto es lo que estoy haciendo:

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 

Esto me parece bastante detallado y un poco feo. ¿Hay una mejor manera?

Y al hacer un enlace a otra semana en el calendario (para paginación semana a semana), ¿tengo que hacer algo como

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

Lo que también parece un poco prolijo y feo. ¿Cuál es la mejor manera de trabajar con las fechas en las rutas?

+0

¿Hay alguna razón por la que deba ser legible y en ese formato? ¿Tendría más sentido configurarlo como coincidencia "events/(: date)" donde: date termine siendo como "2012-05-01" y usted puede hacer un tiempo directo sobre eso en un objeto de fecha real? –

+0

No, este es un proyecto completamente personal, este es tanto un ejercicio de programación como un problema real – DVG

+0

Supongo que llevaré mi respuesta a un campo de respuesta real, entonces. ;) –

Respuesta

8

Mi sugerencia sería no utilizar tres variables separadas. De esa forma no terminará con una gran cantidad de verificación nula y comprobación de cordura en su controlador. Usted puede convertir su partido en el que algo se ve así, con sus limitaciones todavía en el tacto:

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

Así que terminaría con algo un poco más cuerdo en el controlador:

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

Y yo por lo general hacer esos tipos de 'si está puesto en' comprueba algo más parecido a esto, porque me resulta un poco más fácil de leer:

start_date = Date.today unless defined? start_date 

incluso se podría rodar los últimos dos juntos:

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

Tenga en cuenta también que puede ir directamente a una fecha con esta sintaxis: Date.strptime (params [: date], '% Y-% m-% d') –

+0

Punto de interés, puede usar barras diagonales en la parte del parámetro mismo sin dividir las partes en variables separadas? – DVG

+0

No soy positivo. Supongo que sí, pero no lo recomendaría porque es algo ambiguo. Su ruta leería "events/(: date)" y recibirá "events/2012/05/01". En mi opinión, eso se siente un poco sucio, ya que se supone que debes dividirte en una ruta. –