Supponiamo che io abbia un modello Rails chiamato Thing. La cosa ha un attributo url che può essere facoltativamente impostato su un URL da qualche parte su Internet. Nel codice vista, ho bisogno di una logica che procede come segue:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Questa logica condizionale nella vista è brutta. Naturalmente, potrei creare una funzione di supporto, che cambierebbe la vista in questo:
<%= thing_link('Text', thing) %>
Questo risolve il problema della verbosità, ma preferirei davvero avere la funzionalità nel modello stesso. In tal caso, il codice vista sarebbe:
<%= link_to('Text', thing.link) %>
Ciò, ovviamente, richiederebbe un metodo di collegamento sul modello. Ecco cosa dovrebbe contenere:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Al punto della domanda, thing_path () è un metodo indefinito all'interno del codice modello. Suppongo che sia possibile "inserire" alcuni metodi di supporto nel modello, ma come? E c'è una vera ragione per cui il routing funziona solo sul controller e visualizza i livelli dell'app? Mi vengono in mente molti casi in cui potrebbe essere necessario che il codice modello gestisca gli URL (integrazione con sistemi esterni, ecc.).