Routes, Restful et pretty url

Salut tout le monde,

J’aurai besoin de votre opinion concernant mon probleme de routes.

  • Contexte: on va prendre un exemple super simple, une application de
    type
    weblog. Imaginons qu’on a plusieurs blogs, et que l’on veut avoir une
    “pretty” url pour chaque blog du style: http://www.foo.fr/mon_blog1/,

    http://www.foo.fr/mon_blog2, …etc.

  • Mon code actuel pour config/routes.rb:
    ActionController::Routing::Routes.draw do |map|

routes specifiques pour chaque blog

Blog.find(:all).each do |blog|

Important point d’entree !!!

map.connect “/#{blog.name}”, :controller => ‘blogs’, :action =>
‘show’,
:id => blog.id

map.resources blog.name.to_sym, :controller => ‘blogs’
map.resources(blog.name.to_sym) do |blog_resource|
blog_resource.resources :posts, :name_prefix => “#{blog.name}_”,
:path_prefix => “/#{blog.name}”
end
end

  • Resultat: ca marche bien, sauf quand je veux editer par exemple un
    post,
    exemple: http://www.foo.fr/mon_blog1/posts/1;edit. La redirection se
    fait
    bien vers le bon controlleur (a savoir posts), avec le bon id du post et
    la
    bonne action (edit). Mais le probleme est que je ne sais pas pour quel
    blog
    je suis en train d’editer le post.
    Note: C’est vrai que je pourrais le retrouver a partir du post, mais
    j’aimerai le faire de maniere propre.

J’ai pense a truc du genre (avant avant derniere ligne dans le bloc de
code
precedent):
blog_resource.resources :posts, :name_prefix => “#{blog.name}_”,
:path_prefix => “/#{blog.name}”, :blog_id => blog.id

=> malheureusement, map.resources (blog_resource.resources dans mon
exemple)
n’autorise pas le passage d’autres parametres (alors maps.connect le
fait
lui).

Quelqu’un a t’il deja rencontre ce probleme ? Si oui comment avez vous
contourne le pb ? Solution clean (en evitant par exemple de me trimbaler
l’id de mon blog pour chaque url ?

merci d’avance et bon WE a tous

Did

Didier :

:id => blog.id

map.resources blog.name.to_sym, :controller => ‘blogs’

ça veut dire que, si j’ai un blog qui se nomme ‘enclume’,
http://foo.fr/enclumes
http://foo.fr/enclumes/2

sont des URL valides ?

  • Resultat: ca marche bien, sauf quand je veux editer par exemple
    un post, exemple: http://www.foo.fr/mon_blog1/posts/1;edit. La
    redirection se fait bien vers le bon controlleur (a savoir posts),
    avec le bon id du post et la bonne action (edit). Mais le probleme
    est que je ne sais pas pour quel blog je suis en train d’editer le post.

Peut-être une alternative consiste à virer A
et mettre à la fin des routes :

map.resources :posts, :path_prefix => ‘/:blog’

tu auras des routes en :
GET /:blog/posts/
GET /:blog/posts/new
GET /:blog/posts/:id
etc.

Et avec un before_filter qui vérifie que params[:blog] est un
nom de blog valide et initialise @blog comme il faut.

Tu n’auras pas autant d’url helpers que par ta méthode cependant.
(ta méthode suppose que blog.name est ruby friendly : ‘tire-bouchons’
ne marche pas)

– Jean-François.

Merci bcp Jean-Francois !

Ta soluce etait pas mal mais j’avais toujours des problemes. En fait,
c’est
insoluble sans patcher Rails et comme je n’ai pas le temps, on verra
plus
tard.
La solution intermediaire est a base de permaLink.
En gros, j’ai maintenant:
GET /blogs/<blog_name>
GET /blogs/<blog_name>/posts/<post_id-post_name>

Pour avoir,
GET /<blog_name>
GET /<blog_name>/<post_name> ou /<blog_name>/<post_id-post_name>
On verra l’annee prochaine, sauf si le Papa Noel me met la soluce sous
le
sapin !

2006/12/17, Jean-François [email protected]: