Digamos que eu tenho um modelo Rails chamado Thing. O item tem um atributo de URL que pode opcionalmente ser definido como um URL em algum lugar da Internet. No código de exibição, preciso de uma lógica que faça o seguinte:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Essa lógica condicional na exibição é feia. Claro, eu poderia criar uma função auxiliar, que mudaria a visão para isso:
<%= thing_link('Text', thing) %>
Isso resolve o problema da verbosidade, mas eu realmente preferiria ter a funcionalidade no próprio modelo. Nesse caso, o código de exibição seria:
<%= link_to('Text', thing.link) %>
Obviamente, isso exigiria um método de link no modelo. Aqui está o que ele precisa conter:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Ao ponto da pergunta, thing_path () é um método indefinido dentro do código Model. Estou assumindo que é possível "puxar" alguns métodos auxiliares para o modelo, mas como? E existe um motivo real pelo qual o roteamento opera apenas no controlador e exibe as camadas do aplicativo? Posso pensar em muitos casos em que o código do modelo pode precisar lidar com URLs (integração com sistemas externos, etc.).