7
votes

Dessiner la ligne entre le modèle et le contrôleur

Je construisce cette application reposante à l'aide de ROR et je trouve un peu difficile de dessiner une ligne entre des choses qui devraient aller sur le modèle et les choses qui devraient aller sur le contrôleur.

À titre d'exemple, j'ai 7 méthodes sur mon contrôleur (celles qui le rendent illégal, c'est-à-dire index (), spectacle (), créer (), mise à jour (), et constatent souvent qu'il est nécessaire d'ajouter méthodes supplémentaires et le font en les créant en tant que membres.

Ce que j'aimerais accomplir ici, est de rassembler une expérience de vos gars sur ce qui se passe où (c'est-à-dire que je dois coller toutes les interactions de la base de données sur le modèle et simplement appeler ces méthodes à partir du contrôleur?)

En outre, en ajoutant des choses qui n'impliquent pas dB à mon contrôleur, c'est-à-dire. Je souhaite faire un appel HTTP à l'écran à gratter certaines données d'un site Web.

Les appels http peuvent devenir gros et désordonnés. Si tout cela va à mon contrôleur ou si cela devrait-il passer une classe ou un module distinct, et ne peut être incluse que sur mon contrôleur afin que cela puisse être appelé?

Si oui, quelle serait la meilleure approche pour le faire?

Je suis un peu confus avec tout cela, il serait donc génial d'avoir la contribution de quelqu'un.

Merci d'avance


4 commentaires

J'ai constaté que j'ai rarement besoin d'actions supplémentaires dans un contrôleur reposant. Au lieu de cela, je déplace cette action à son propre contrôleur où il peut s'agir d'une action standard avec un nom approprié. Cela a définitivement pris un certain temps pour changer de mentalité en cette pensée, cependant.


@WesGarrison: Pourriez-vous fournir un exemple à propos de l'utilisation d'actions de repos avec un autre contrôleur?


@giorgien: désolé pour la réponse tardive. Si j'ai un helpdesk avec des billets, je souhaiterais peut-être ajouter une méthode dans Tickets_Controller appelée my_tickets (pour répertorier mes billets). Au lieu de cela, je pense à cela comme une ressource distincte: les billets qui sont miens; En ce qui concerne un nouveau contrôleur: my_tickets_Controller avec seulement une action index () (je ne montre pas / mise à jour dans my_tickets, ceux qui vont au billets_Controller). De cette façon, le contrôleur est ... contrôler quelles informations sont sélectionnées et présentées à la vue. Exemple trivial, mais j'espère qu'il illustre le concept. Pensez aux ressources avec index / spectacle / créer / mettre à jour.


@WesGarrison: OK, merci. Cela me semble un bon design.


6 Réponses :


0
votes

Lorsque j'ai utilisé des appels de savon des rails, ce qui est similaire à ce dont vous parlez d'une manière, j'ai traité ceux comme source de données, donc à mon esprit qu'ils appartenaient au modèle. Vous pouvez également choisir si la fonctionnalité est quelque peu générique, écrire un plugin pour faire ce travail également ou trouver un plugin qui fait la plupart de ce que vous voulez déjà et utilisez cela.

En cas de doute, pensez à votre modèle comme application et votre affichage / contrôleur comme interface. Si ce n'est pas clairement interface, cela appartient probablement au modèle.

Cette question peut aider.


0 commentaires

1
votes

Les trucs de raclage devraient aller dans un modèle non ActiveCord, et le contrôleur devrait simplement appeler des méthodes de ce modèle.

Il y a un joli Exemple d'un modèle AR sans défaite et One d'un modèle non-AR sur railscasts .

Donc, votre contrôleur ferait quelque chose comme: xxx

et votre quelque chose implémenterait la logique nécessaire.


3 commentaires

D'accord; Généralement, les rails ont un modèle de 1 à 1: le rapport de table, mais ce n'est que parce que la base de données est la plus souvent source de données. Les modèles sont vraiment destinés à la logique commerciale en premier et cachent la base de la base de données.


Donc, vous diriez-vous que mes trucs à scrapper devraient être sur un modèle séparé, et je voudrais juste prolonger la classe sur mon contrôleur?


Le responsable du contrôleur est de rassembler des params (le cas échéant) à être transmis au modèle; Le modèle ne devrait rien savoir sur les utilisateurs, les demandes, Querystrings, etc.



3
votes

En règle générale, une bonne approche (sans flamme de religion, PLZ) doit avoir mince contrôleurs et graisse modèles. De cette façon, vous pouvez également tester facilement "les choses" les modèles sont censés faire ...


1 commentaires

Modèles de graisse, contrôleurs maigres: weblog.jamisbuck.org/2006/ 10/18 / Skinny-Controller-Fat-Model



1
votes

Je m'enlève aux règles du contrôleur mince et des modèles de graisse.

Compte tenu d'une approche reposante, je garde toutes les contrôleurs à cette norme et que d'autres méthodes en dehors de la valeur par défaut. Si j'ai besoin de nouvelles fonctionnalités et que vous notez que les méthodes font des choses similaires (ou si vous auriez une nommée similaire E.G Group_add, Group_ReMove), je crée un nouveau contrôleur et utilisez des modèles existants et créez de nouvelles méthodes dans le modèle.

Cela permet également une approche reposante de ces actions supplémentaires de manière significative et spécifiquement chaque action a une spécification étroitement définie pour son fonctionnement, elle ne fera jamais plus d'une chose. Rien de pire que d'utiliser un appel d'API qui fait deux choses dépendant de la façon dont elle s'appelle.

Une approche que j'utilise est de gérer la demande comme étant «rapide» que possible en utilisant autant de code que nécessaire et en résenant des tâches complexes / opérations complexes au modèle.


0 commentaires

4
votes

Il fait partie de Conception de domaine pilotée .

Le domaine est la sphère des connaissances qui définit la zone que l'application tente de travailler avec et de résoudre des problèmes.

La couche de modèle est considérée comme la couche de domaine. C'est ici que toutes les règles définissant le domaine ou la logique commerciale sont conservées. Le modèle agit comme un filtre entre les données réelles et le reste de l'application d'une manière qui définit le domaine.

Les détails de la mise en œuvre du domaine (MySQL ou MSSQL ou MSSQL ou WebService ou XML Fichier ou page Web externe ou autre) sont cachés par le modèle.

Le contrôleur est juste le messager. Son travail consiste à prendre des messages de l'utilisateur et à les transmettre au modèle. Le modèle propose une réponse et le contrôleur travaille le meilleur moyen de transmettre cela à l'utilisateur.

La vue est comme l'artiste de maquillage, en veillant à ce que les données soient bonnes et présentes pour l'utilisateur.

Le site Web que vous avez gratté pourrait être considéré comme faisant partie du domaine. Ce site contient des connaissances qui définissent le monde que votre application définit. Le processus de joie de croître sculpte cette connaissance de manière à ce que cela se rapporte au reste de la vision du monde que votre application définit. Le contrôleur ne se souciait pas d'où provient ces connaissances, cela passera simplement le message à la vue. La vue va conclure sur les données et le rendre jolie et l'envoyer à l'utilisateur, qui est complètement inconscient de tout le processus et voit juste une jolie page Web!


0 commentaires

0
votes

Je préfère également les contrôleurs maigres et les modèles de graisse ... Un bon outil pour vous aider à appliquer cette règle est la héritée_resources Gem de José Valim. Je vous suggère de jeter un coup d'œil à cela: http://github.com/josevalim/inherited_resources


0 commentaires