2013-04-02 1 views
1

Dans mon application Users peut LikePrograms. Chacun de ceux-ci est un modèle, Like est polymorphe.Quel contrôleur de rails dois-je utiliser?

À un moment donné, je veux voir tous les Users qui Like un Program tout ou Programs un User Likes.

Est-il préférable d'avoir une action de contrôleur likes et likers dans le contrôleur users et programs? Ou devrais-je avoir le contrôleur likes en tant que ressource imbriquée avec à la fois une action users et programs (ou un index qui vérifie quelle ressource imbriquée est utilisée)? Je me rends compte que tout cela peut fonctionner, mais je ne savais pas quelles étaient les meilleures pratiques de Rails.

Répondre

1

Je voudrais structurer votre application pour avoir un UsersController avec une action de membre likes qui renvoie le Program s que l'utilisateur aime. Et puis avoir un ProgramsController avec une action de membre likers, ce qui donne les User s qui aiment ce programme.

Pour simplifier les choses, (et même, montrer les utilisateurs qui aiment un programme en action show du programme), vous pouvez aussi simplement inclure les goûts de l'utilisateur dans l'action show, bien que vous pouvez finir par aller chercher plus d'informations que nécessaire dans les actions show en faisant de cette façon.

+0

Existe-t-il une règle générale pour décider de ces choses? Comme moins de contrôleurs, c'est mieux? – dewyze

+0

Si vous avez créé un 'LikesController', sa ressource serait un" like ", ce qui semble être le" modèle de jointure "dans votre scénario. Votre description donnait l'impression que vous vouliez accéder à des «likes» organisés par un utilisateur particulier ou par un programme particulier, il est donc plus logique de présenter les likes comme des actions sur UsersController ou ProgramsController. –

1

De façon réactive, vous auriez un LikesController et une action 'create' en dedans prendrait un user_id et un program_id. Il est probable que l'utilisateur sera connecté (et ne sera pas dans l'URL), et il sera logique de créer un comme, en passant un program_id à une URL qui ressemble à ceci:

POST /likes, :params => { :program_id => ___ } 

Vous peut vouloir afficher une liste de J'aime (page d'index), permettant peut-être aux utilisateurs d'éditer et de supprimer. Si c'est le cas, toutes vos actions seront sur likes_controller. Habituellement, cela dépend de votre situation, mais un design reposant est généralement le bon endroit pour commencer.

+0

L'exemple est fait via AJAX. Il y a des actions créer et détruire, cette partie fonctionne bien. J'aurais besoin de Likes en tant que ressource imbriquée sous les utilisateurs et les programmes afin de conserver les actions dans le contrôleur likes. Il semble plus facile dans les contrôleurs d'utilisateur et de programme ... mais il ne s'est pas senti très RESTful. – dewyze

+1

Je vois. Si vous cherchez une liste de programmes, ce serait sur l'action d'index dans ProgramsController. Il peut être filtré par user_id et avoir une URL comme users/1/programs. Mais, il est également possible que vous vouliez vraiment aimer les utilisateurs/1/j'aime. Si c'est le cas, j'ajouterais simplement une méthode pour filtrer les likes dans l'action d'index sur le contrôleur likes. La dernière option que j'ai utilisée est de faire des contrôleurs pour les jointures - UserLikesController et ProgramLikesController. La seule action serait l'index. C'est bien parce que vous pouvez sous-classifier les Likes et conserver les permissions avant les filtres, etc. – Swards

+0

Oooo, c'est une idée intéressante. Je vais devoir essayer ça et voir comment cela fonctionne. – dewyze