Digamos que tengo un modelo de Rails llamado Thing. Thing tiene un atributo url que puede opcionalmente establecerse en una URL en algún lugar de Internet. En el código de vista, necesito la lógica que hace lo siguiente:¿Se pueden utilizar los modificadores de enrutamiento Can Rails (es decir, mymodel_path (modelo)) en los modelos?
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Esta lógica condicional en la vista es fea. Por supuesto, podría construir una función de ayuda, lo que cambiaría la vista a este:
<%= thing_link('Text', thing) %>
que resuelve el problema de la verbosidad, pero realmente preferiría tener la funcionalidad en el modelo mismo. En ese caso, el código de vista sería:
<%= link_to('Text', thing.link) %>
Esto, obviamente, requeriría un método de enlace en el modelo. Esto es lo que tendría que contener:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Hasta el punto de la cuestión, thing_path() es un método no definido en el interior Código del modelo. Supongo que es posible "incorporar" algunos métodos de ayuda en el modelo, pero ¿cómo? ¿Y hay una razón real por la que el enrutamiento solo opera en el controlador y ve las capas de la aplicación? Puedo pensar en muchos casos en los que el código modelo puede necesitar tratar con URL (integrarse con sistemas externos, etc.).
Un caso de uso sería: para generar URL acortado de goo.gl en un afterSave, – lulalala
probablemente debería envolverte modelo en un presentador si desea agregar lógica de vista, esto mantendrá las capas MVC separadas. Ver Draper (https://github.com/jcasimir/draper). – Kris
Consulte también la sección "Generación de URL para rutas con nombre" en la documentación en http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html – Backo