2

Donc je suis dans une situation où je dois décider si oui ou non d'avoir un contrôleur séparé pour un morceau de code particulier. Nous avons une page d'accueil qui agit comme un hub pour le reste du site. La page est accessible à tous les utilisateurs (connectés et non connectés). Je pensais avoir home comme un contrôleur séparé et une action appelée index. En pensant à cette situation, j'ai commencé à me demander s'il y avait des règles ou des lignes directrices sur ce front. Ma perception a été que si un code tourne autour d'une entité, la séparation est nécessaire. (Similaire aux directives REST) ​​Si l'entité est un nom, il devrait s'agir d'un contrôleur. Si l'entité est un verbe, elle devrait probablement être une action et devrait résider dans le contrôleur dont le nom est le même que celui du nom auquel le verbe fait référence. Certains collègues ont suggéré que, puisqu'il s'agit d'une action, elle devrait résider dans le contrôleur existant et devrait s'appeler home. Je n'étais pas du tout d'accord, mais je ne trouvais pas de source de confiance qui me soutiendrait.Comment savoir quand et si avoir un contrôleur séparé pour un morceau de code?

Aimeriez-vous connaître votre opinion?

Répondre

1

Dans ce cas, je suis d'accord avec vos collègues. REST est une bonne approche à prendre quand il s'agit de ressources, comme vous le dites. Cela vous permet de créer une interface cohérente, notamment en vue de créer un service Web.

Toutefois, REST ne correspond pas vraiment à un paramètre de navigateur Web. Vous remarquerez par exemple que même pour les ressources, vos/edit et/new actions ne sont que des requêtes GET renvoyant un formulaire HTML pointant vers l'action RESTful pertinente. 'edit' et 'new' ne sont pas du tout RESTy. De même, la page d'accueil est généralement une amalgamation conviviale de diverses données, non adaptée à une interface RESTful. Donc, soit juste coller un contrôleur supplémentaire avec une action, ou bien utiliser l'action de la « liste » d'un contrôleur existant comme la page d'accueil

+3

"Toutefois REST ne correspond pas vraiment à un paramètre de navigateur Web." Wow, ça va être un choc pour Roy Fielding, le gars qui a inventé le nom REST. Il a extrait la définition de REST en fonction de la manière dont fonctionnent les applications Web performantes. Le fait que ROR a créé ces/edit et/nouveaux points de terminaison est le reflet de l'utilisation abusive de REST de REST pas un manque d'applicabilité. –

+0

Eh bien, cela n'a pas répondu à la question de savoir quand doit-on séparer le code dans un nouveau contrôleur. Je vois les contrôleurs comme des objets contextuels et des méthodes comme leur comportement. La question demeure toujours que donné un morceau de code, comment je sais que j'ai besoin d'un nouveau contrôleur pour ce code ou devrait-il juste être une action ou un ensemble d'actions dans un contrôleur existant. Si l'on pouvait donner une solution avec des raisons de ce qu'il faut faire dans le cas de la page 'home' (comme indiqué dans la question), cette question recevrait une réponse automatique. – Chirantan

+0

@Darrel - Je ne dis pas que REST ne fonctionne pas sur le web, c'est un paradigme utile pour les services HTTP. Mais la façon dont il n'y a pas de réflexion sur le service sans ajouter de formulaires HTML supplémentaires est un problème lorsque vous l'utilisez dans des applications Web. En outre, les navigateurs ne prennent généralement en charge que les verbes GET et POST, avec d'autres solutions de contournement nécessaires pour permettre l'utilisation des autres verbes. – Gareth

0

Le problème commence par la phrase

Si une entité est un verbe

Si vous tentez de produire une architecture RESTful, une entité ne peut pas être un verbe. Les seuls verbes autorisés si vous utilisez HTTP sont GET, PUT, POST, DELETE, HEAD, OPTIONS. Toutes les entités doivent être mappées à un nom et si vous essayez de récupérer cette entité, vous devez utiliser le verbe GET. Personnellement, je voudrais mapper cela à la méthode Get() sur mon contrôleur mais je ne sais pas si Rails vous permet de le faire.

+1

Les remarques concernant la réponse de Gareth devraient se trouver dans la section des commentaires, et non dans la réponse. –

+0

@Sailing Judo Heureux? –

0

La réponse rapide (et inutile) est que l'une ou l'autre façon fonctionne bien.

Je pense que tout le monde vient à travers cette décision à un moment donné, et la décision que vous prenez dépend de l'avenir probable du site ... ce qui signifie qu'il est enclin à l'optimisation prématurée ... mais c'est toujours la prise,

Comme vous l'avez probablement déjà deviné, "home" est à la fois un verbe et un nom, donc pourquoi vous n'arrivez pas à savoir quoi faire.

La réponse dépend d'une combinaison d'interprétation de la structure de votre site et combien de temps est disponible pour vous ...

si vous avez très peu de temps pour travailler sur ce ...Ensuite, le fait de bourrer l'action 'home' dans un autre contrôleur est souvent considéré comme l'option appropriée. Cela fonctionne, il vous permet de passer à d'autres tâches (probablement plus productives).

Cependant, je suis d'accord qu'il est parfois bon de prendre du recul et de réfléchir à ce que vous faites et si cela pourrait être fait "mieux" ... dans ce cas, mais il est plus difficile de définir car il est peu probable que l'action de la maison dans un nouveau contrôleur soit plus rapide ... et si c'est la seule action dans le contrôleur ... on peut se demander s'il vaut mieux, architecturalement, l'ajouter à un contrôleur existant ... Nous commençons donc ce qui est surtout un débat philosophique ... en d'autres termes, aucune réponse ne sera «plus correcte» que l'autre - c'est plutôt une question de goût et de circonstance. Dans ce cas, le débat s'articule autour de rendre la structure plus RESTful. Pour être fidèle à l'architecture RESTful, vous devez déplacer l'action dans son propre contrôleur ... mais vous devez d'abord identifier l'entité. La page d'accueil n'est souvent pas facilement identifiable en tant qu'entité db spécifique ... c'est plus souvent une page de portail. Parfois, vous pouvez choisir une entité, par exemple, les boutiques en ligne auront souvent une page d'accueil qui est en fait une variation de "produits # index", ou parfois la page "d'accueil" est une page d'affichage # d'utilisateur ... mais plus souvent, votre page d'accueil ne sera pas simple, et combinera des informations provenant de plusieurs entités ... alors pourquoi il est difficile de décider quelle sera la «bonne» architecture.

Si vous ne pouvez pas identifier une entité spécifique, il existe un débat valide quant à l'opportunité de déplacer l'action dans un contrôleur spécifique. Cependant, vous pouvez toujours créer une nouvelle "entité" centrée autour de l'architecture du site. Ceci est particulièrement probable si vous allez trouver d'autres pages non spécifiques à l'entité pour le site (par exemple T & Cs ou une page "sur notre société").

La fallback habituelle étant un « PageController » (ou nom similaire) qui n'est pas liée à un enregistrement actif modèle, mais à une entité plus nébuleux, dans ce cas, une « page » qui est reconnaissable à un utilisateur du site Web (par exemple la "page d'accueil" et la page "T & C" et la "page"). Chaque action serait pour une page spécifique ...

Alors, c'est à vous de décider si cela correspond mieux à votre vision de l'architecture de votre système ... et si ça en vaut la peine ... mais c'est mon point de vue sur le débat. :)

Questions connexes