2015-04-24 2 views
1

J'ai un itinéraire configuré comme ceci:Une meilleure façon de construire urls

get "calendar/:year/:month" => "calendar#month", as: :calendar_month 

Pour créer des liens pour le mois et « précédent » mois « suivant », voici ce que vous devez utiliser dans votre modèle:

<%= link_to "Next", calendar_month_path(year: @date.next_month.year, month: @date.next_month.month) %> 

ou un peu plus simple:

<%= link_to "Previous", calendar_month_path(@date.prev_month.year, @date.prev_month.month) %> 

Les deux se sentent un peu bavard.

Est-il possible de tirer parti de ce que le retour @date.prev_month/@date.next_month un objet (Date) qui a des procédés qui répondent aux défini dans params d'itinéraire (:year, :month)?

Quelque chose de similaire à:

<%= link_to "Previous", calendar_month_path(@date.prev_month) %> 

serait une solution idéale, mais il ne fonctionne pas.

Comment gérez-vous des situations similaires?

Merci pour tout conseil!

Répondre

2

Vous pouvez toujours ajouter une méthode dans vos aides pour convertir la date à un calendar_month_path:

def path_for_date(d) 
    calendar_month_path(d.year, d.month) 
end 

Ce qui signifie que vos liens sont:

link_to("Previous", path_for_date(@date.prev_month) 
link_to("Next", path_for_date(@date.next_month) 

En fonction de vos autres itinéraires que vous voudrez peut-être nommez-le un peu mieux que j'ai, mais vous avez l'idée.