Disons que j'ai un modèle Rails appelé Thing. La chose a un attribut url qui peut éventuellement être défini sur une URL quelque part sur Internet. Dans le code d'affichage, j'ai besoin d'une logique qui effectue les opérations suivantes:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Cette logique conditionnelle dans la vue est moche. Bien sûr, je pourrais créer une fonction d'aide, qui changerait la vue en ceci:
<%= thing_link('Text', thing) %>
Cela résout le problème de verbosité, mais je préférerais vraiment avoir la fonctionnalité dans le modèle lui-même. Dans ce cas, le code d'affichage serait:
<%= link_to('Text', thing.link) %>
Cela nécessiterait évidemment une méthode de liaison sur le modèle. Voici ce qu'il devrait contenir:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Au point de la question, thing_path () est une méthode non définie dans le code du modèle. Je suppose qu'il est possible de "tirer" certaines méthodes d'aide dans le modèle, mais comment? Et y a-t-il une vraie raison pour laquelle le routage ne fonctionne qu'au niveau du contrôleur et des couches d'affichage de l'application? Je peux penser à de nombreux cas où le code du modèle peut avoir besoin de gérer les URL (intégration avec des systèmes externes, etc.).