Question

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

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 ne peux pas utiliser de nombreux plugins parce que je suis en utilisant des itinéraires personnalisés.

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 ont le post_path link_to (de @post) donnent l'URL ci-dessus et la edit_post_path link_to (@post) ... article-titre / modifier

J'ai aussi: has_many => [: commentaires] et je voudrais que travailler 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 sais pas ce que je fais mal. Est-il même possible d'y arriver?

Était-ce utile?

La solution

Je pense que ça ne fonctionne pas parce que vous n'êtes pas à l'aide d'un itinéraire personnalisé. Je le fais tout le temps. Je configurer simplement un itinéraire personnalisé simple:

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

Ensuite, 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'un itinéraire nommé indique explicitement à des rails pour utiliser cet itinéraire. Faites-moi savoir si cela pour vous permet de résoudre!

Autres conseils

Voici comment je suis allé à ce sujet ...

D'abord, je ne suis pas d'essayer d'utiliser la méthode URL générée itinéraire. De plus, je ne vais pas que vous dans la même mesure en termes de contrôle de la mise en forme des paramètres de date. Depuis que je suis création automatique des la création et timbres à date d'URL, je ne suis pas préoccupé par la validité du format, je suis tout simplement mise en forme d'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'

Depuis que 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 l'aide dans inclus 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 finis avec une URL comme: http://wallscorp.us/content / 2009/12/06 / liens

Vive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top