392 votes

Pouvez les assistants de routage de Rails (c.-à-d. mymodel_path(model)) être utilisées dans les modèles ?

Dire que j'ai un Rails de Modèle appelé Chose. Chose a un attribut url qui peut éventuellement être réglé à une URL quelque part sur Internet. Dans la vue de code, 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, c'est moche. Bien sûr, je pourrais construire une fonction d'assistance, qui allait changer la vue de ceci:

<%= thing_link('Text', thing) %>

Qui résout le niveau de verbosité de problème, mais je préfère vraiment avoir la fonctionnalité dans le modèle lui-même. Dans ce cas, le code de la vue serait:

<%= link_to('Text', thing.link) %>

De toute évidence, cela nécessiterait une méthode de liaison sur le modèle. Voici ce qu'elle devrait contenir:

def link
  (self.url.blank?) ? thing_path(self) : self.url
end

Le point de la question, thing_path() est une méthode non définie à l'intérieur d'un Modèle de code. Je suis en supposant qu'il est possible de "tirer" quelques méthodes d'aide dans le modèle, mais comment? Et est-il une vraie raison pour que le routage ne fonctionne qu'au contrôleur et vue couches de l'application? Je peux penser à beaucoup de cas où le code du modèle doivent traiter avec des Url (à l'intégration avec des systèmes externes, etc).

730voto

Paul Horsfall Points 3612

Dans Rails 3 et 4, vous pouvez utiliser :

par exemple

190voto

Aaron Longwell Points 3590

J’ai trouvé la réponse concernant la façon de le faire moi-même. Dans le code du modèle, il suffit de mettre :

Pour Rails

Pour Rails 3 :

Cela fait comme par magie renvoie l’URL pour la chose courante, ou quelques autre URL de retour.

130voto

matthuhiggins Points 902

Vous pouvez aussi trouver l’approche suivante plus propre que notamment chaque méthode :

14voto

Josh Delsman Points 2333

Toute logique ayant trait à ce qui est affiché dans la vue doit être délégué à une méthode d’assistance, comme les méthodes dans le modèle sont strictement pour le traitement des données.

Voici ce que vous pourriez faire :

1voto

Ryan Montgomery Points 5153

Alors qu’il pourrait y avoir un moyen, j’aurais tendance à garder ce genre de logique du modèle. Je suis d’accord que vous ne devrait pas mettre cela dans la vue (Gardez-le maigre), mais à moins que le modèle retourne une url comme un élément de données au contrôleur, le routage stuff devrait être dans le contrôleur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X