Digamos que tengo un modelo de rieles llamado Thing. La cosa tiene un atributo de URL que opcionalmente se puede establecer en una URL en algún lugar de Internet. En el código de vista, necesito una lógica que haga lo siguiente:
<% 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 auxiliar, que cambiaría la vista a esto:
<%= thing_link('Text', thing) %>
Eso resuelve el problema de verbosidad, pero realmente preferiría tener la funcionalidad en el modelo en sí. En cuyo caso, el código de vista sería:
<%= link_to('Text', thing.link) %>
Obviamente, esto requeriría un método de enlace en el modelo. Esto es lo que debería contener:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Hasta el punto de la pregunta, thing_path () es un método indefinido dentro del código del Modelo. Supongo que es posible "incorporar" algunos métodos auxiliares al modelo, pero ¿cómo? ¿Y hay una razón real por la que el enrutamiento solo funciona en el controlador y ve las capas de la aplicación? Puedo pensar en muchos casos en los que el código del modelo puede necesitar tratar con URL (integración con sistemas externos, etc.).