Powiedz, że mam model szyny o nazwie Thing. Rzecz ma atrybut url, który można opcjonalnie ustawić na adres URL gdzieś w Internecie. W widoku kodu potrzebuję logiki, która wykonuje następujące czynności:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Ta logika warunkowa w widoku jest brzydka. Oczywiście mógłbym zbudować funkcję pomocnika, która zmieniłaby widok na to:
<%= thing_link('Text', thing) %>
To rozwiązuje problem z gadatliwością, ale naprawdę wolałbym mieć funkcjonalność w samym modelu. W takim przypadku kod widoku to:
<%= link_to('Text', thing.link) %>
To oczywiście wymagałoby metody link w modelu. Oto, co powinien zawierać:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Do rzeczy pytania rzecz_path () jest niezdefiniowaną metodą w kodzie modelu. Zakładam, że możliwe jest „wciągnięcie” niektórych metod pomocniczych do modelu, ale jak? Czy istnieje prawdziwy powód, dla którego routing działa tylko na kontrolerze i wyświetla warstwy aplikacji? Mogę wymyślić wiele przypadków, w których kod modelu może wymagać obsługi adresów URL (integracja z systemami zewnętrznymi itp.).