2011-12-02 4 views
0

J'ai une application, construite avec Rails 3.1.3, qui a des produits et des catégories. Les catégories sont liées à d'autres catégories, donc une catégorie peut être une catégorie parent ou une catégorie enfant. Les produits sont ensuite associés à une catégorie enfant. Maintenant, je pense à la façon dont je devrais définir les routes. Est-ce une bonne idée d'imbriquer en quelque sorte les catégories et les ressources de produits? Idéalement, je voudrais des URL comme ceci:Ressources imbriquées ou non pour les catégories?

example.com/parent/child/product-1234 

like this: 
example.com/clothes/underwear/some-socks-1234 

or maybe like this to keep it restful? 
example.com/p/clothes/c/underwear/.... 

Mais peut-être que c'est un peu compliqué à réaliser avec les routes? Je devrais imbriquer la catégorie avec elle-même, je suppose?

Des idées sur la façon de réaliser quelque chose comme ça?

EDIT: Est-ce que je crée les routes de la catégorie comme celle-ci:

resources :categories, :as => "parent" do 
    resources :categories, :as => "child" 
end 

ou similaire? Ce n'est pas si important d'avoir le produit imbriqué dans les catégories. Peut-être cela rendra-t-il difficile à gérer ...

+0

Rails a intégré la prise en charge des ID dans les URL de la forme '12345-some-textual-name'. La partie non numérique est supprimée pour le contrôleur, mais elle permet d'obtenir des slugs d'URL plus beaux. – Nick

+0

@Nick Oui. Mais qu'en est-il de l'imbrication réelle? Puis-je faire quelque chose comme ce que j'ai ajouté à ma question originale? Nest il à l'intérieur de lui-même? – Linus

Répondre

1

Vous pouvez être soit RESTful ou non, vous ne pouvez pas l'avoir dans les deux sens.

Si la catégorie est une ressource, vous pouvez définir des routes avec l'instruction resource :categories et utiliser la prise en charge intégrée de Rails pour REST. Mais alors toutes les catégories devraient être accessibles par categories/id. Si vous souhaitez que différentes catégories soient accessibles via différentes routes, vous n'êtes pas RESTful et vous ne pouvez pas utiliser le support Rails REST. Vous pouvez également dire que les catégories parent et enfant sont des ressources différentes et être à nouveau RESTful.

Modifier: en regardant ma réponse maintenant (après qu'il a été accepté) Je me sens comme si j'étais probablement trop raide. La réponse devrait probablement être "ça dépend" (comme d'habitude). Si l'application est CRUD (admin), je m'en tiendrai aux catégories simples et aux produits imbriqués (peu profonds). Sur la vitrine où vous avez besoin d'url belle apparence, vous pouvez totalement avoir des routes et des actions non-REST. Cela signifie simplement plus de codage.

1

J'ajouterais une route supplémentaire en plus des routes RESTful pour supporter vos URLs. Cela ignore les catégories (elles n'ont même pas besoin d'exister) et les achemine directement vers le produit.

... 

    resources :products 
    resources :categories 

    match ':parent/:child/:product' => "products#show" 

    ... 

Dans votre action show vous pouvez simplement vérifier que des params[:product] et params[:id] qui est défini et gérer les différentes routes. params[:parent] et params[:child] seront également disponibles mais je suggérerais simplement de rechercher le produit et d'obtenir la catégorie à travers cet objet puisque cela devrait être plus fiable.

Questions connexes