Скажем, у меня есть модель Rails под названием Thing. Вещь имеет атрибут url, который может произвольно устанавливать URL-адрес где-то в Интернете. В коде зрения мне нужна логика, которая делает следующее:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Эта условная логика в представлении является уродливой. Конечно, я мог бы создать вспомогательную функцию, которая изменила бы представление на это:
<%= thing_link('Text', thing) %>
Это решает проблему многословности, но я бы предпочел иметь функциональность в самой модели. В этом случае код представления:
<%= link_to('Text', thing.link) %>
Это, очевидно, потребует метода ссылок на модель. Здесь он должен содержать:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
В вопросе вопроса thing_path() является методом undefined внутри кода модели. Я предполагаю, что можно "втягивать" некоторые вспомогательные методы в модель, но как? И есть ли реальная причина, что маршрутизация работает только на контроллере и просматривает уровни приложения? Я могу придумать множество случаев, когда код модели может потребоваться для обработки URL-адресов (интеграция с внешними системами и т.д.).