2010-08-18 4 views
1

Je veux l'url d'un poste utilisateur à être comme ceci:routage Rails aide

example.com/users/username/post-name

Comment dois-je configurer cela?

Actuellement, le modèle de poste contient:

def to_param 
    name.parameterize 
end 

(pour couper les mots le nom de poste en conséquence)

routes.rb contient:

map.resources :users 
    map.resources :posts 

De préférence, je voudrais dire post_path (post) et cela générerait le chemin approprié pour moi en trouvant le post.user automatiquement.

Que dois-je faire pour que cela se produise?

également ajouté

map.resources :users do |user| 
    user.resources :posts 
end 

Répondre

1

Une façon plus:

map.resources :users do |user| 
    user.connect ':name/:action', :controller => 'posts', :defaults => {:action => 'show'} 
end 

itinéraires disponibles:
example.com/users/username/post-name
example.com/users/username/post-name/edit (tout action)

+0

dans ce cas si vous accédez à la route comme/users/first/second puis params [: nom] = second et params [: user_id] = premier – Bohdan

0

Ce to_param a l'air bien, mais les aides BUILTIN ne lient pas aux ressources imbriquées comme vous voulez, vous auriez à utiliser user_post_path(user, post). Bien sûr, vous pouvez écrire votre propre méthode d'assistance post_path qui fonctionne comme vous le souhaitez.

def post_path(post) 
    url_for [post.user, post] 
end 
+0

Cela fonctionne presque. Cela me donne une URL comme/users/username/posts/post-name. Je ne veux pas que la partie "posts" de l'URL existe. – amaseuk

1

Salut Pour rendre votre application reconnaître les routes comme

example.com/users/username/post-name 

vous devez ajouter à votre routes.rb

map.connect 'users/:username/:post', :controller => "users", :action => "test" 

Ensuite, vous pouvez accéder à params[:username] et params[:post] dans vos contrôleurs test action que vous devrait le définir après map.resources :users mais avant map ':controller/:action/:id' mais vous devez écrire votre propre aide er puis