2009-12-09 7 views
6

Je cherche à faire quelque chose de similaire une limace wordpress où j'ai une URL comme celui-ci tout en maintenant le routage RESTful:Rails RESTful de routage avec «/» et Limaces

http://foo.com/blog/2009/12/04/article-title

La raison pour laquelle je suis intéressé par garder le routage RESTFUL est que je suis incapable d'utiliser de nombreux plugins parce que j'utilise des routes personnalisées.

Je l'ai déjà fait l'apparition RESTful avec:

map.connect '/blog/:year/:mon/:day/:slug', 
       :controller => 'posts', :action => 'show', 
       :year => /\d{4}/, :month => /\d{2}/, 
       :day => /\d{2}/, :slug => /.+/, 
       :requirements => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/, :slug => /.+/ }

Pour écrire les liens, je devais écrire sur commande link_to aides pour générer les URL appropriées. Je voudrais vraiment faire ce RESTful et avoir le link_to post_path (@post) céder l'URL ci-dessus et le link_to edit_post_path (@post) ... titre de l'article/modifier

J'ai aussi: has_many => [: commentaires] et je voudrais que cela fonctionne aussi bien. Le link_to que j'ai essayé ressemble à ceci:

'posts', :action => 'show', :year => recent_post.datetime.year.to_s, 
      :month => sprintf('%.2d', recent_post.datetime.mon.to_i), 
      :day => sprintf('%.2d', recent_post.datetime.mday.to_i), 
      :slug => recent_post.slug %> 

et donne ce (qui est pas ce que je veux):

http://foo.com/posts/show?day=30&month=11&slug=welcome-to-support-skydivers&year=2009

Je ne suis pas sûr de ce que je fais mal. Est-il même possible d'accomplir cela?

+0

Pour être plus précis quant au raisonnement, j'essaie d'utiliser un plugin générateur de sitemap qui utilise les routes générées à travers la carte.section ressources des routes.rb. J'essaie d'éviter d'avoir à étendre le plugin pour gérer complètement les routes personnalisées. J'ai déjà écrit les helpers pour générer les liens eux-mêmes. Je suis curieux de savoir s'il est possible d'utiliser des URL générées par des routes. –

Répondre

2

Je pense que cela ne fonctionne pas parce que vous n'utilisez pas un itinéraire personnalisé. Je fais ça tout le temps. J'ai simplement configurer un itinéraire personnalisé simple:

map.present_page '/blog/:year/:month/:day/:slug', 
      :controller => 'posts', :action => 'show' 

alors vous devriez être en mesure de le faire:

present_page_path(:year => 2009, 
        :month => "December", 
        :day => "13", 
        :slug => "just-an-example") 

La raison pour laquelle vous obtenez une chaîne de requête est très probablement parce que les rails ne fait pas la connexion à votre itinéraire pour une raison quelconque. L'utilisation d'une route nommée indique explicitement aux rails d'utiliser cette route. Faites-moi savoir si cela résout pour vous!

+0

C'est exactement ce que je cherche. En utilisant votre exemple, je suis allé un peu plus loin (car générer mon: année,: mois,: jour n'était pas simple) et ajouté une méthode à mon modèle appelé named_route_generator qui retourne un hachage des valeurs. Maintenant, dans la vue, je fais juste: show_url (post.named_route_generator). Merci. –

+2

Malheureusement, des choses comme 'present_page_url (@post)' ou 'url_for (@post)' ne fonctionnent pas avec cette solution. –

1

Voilà comment je suis allé sur ce ...

D'abord, je ne suis pas d'essayer d'utiliser la méthode URL générée itinéraire. En outre, je ne vais pas dans la même mesure que vous en termes de vérification de la mise en forme des paramètres de date. Comme je génère automatiquement les datastamps et la création d'URL, je ne suis pas concerné par la validité du format, je suis simplement en train de formater un objet ActiveSupport :: TimeWithZone.

Commençons par l'itinéraire concerné:

map.post_by_date 'content/:year/:month/:day/:slug', 
        :controller => 'posts', 
        :action  => 'show_by_date_slug' 

Comme je ne voulais pas vous soucier de la mise en forme des arguments, ou la répétition, j'ai créé une méthode d'assistance et inclus l'aide dans le contrôleur concerné:

def pubdate_slug_url(post) 
    year = post.published_on.strftime('%Y') 
    month = post.published_on.strftime('%m') 
    day = post.published_on.strftime('%d') 

    url = "/" + ["content", year, month, day, post.slug].join("/") 

    return url 
    end 

Enfin, à mon avis, je l'appelle simplement la méthode, en passant dans mon objet post:

<h2><%= link_to post.headline, pubdate_slug_url(post) %></h2> 

Je me retrouve avec une URL comme: http://wallscorp.us/content/2009/12/06/links

Cheers.