Скажем, у меня есть модель Rails под названием Thing. У 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 () - это неопределенный метод внутри кода модели. Я предполагаю, что в модель можно добавить некоторые вспомогательные методы, но как? И есть ли реальная причина, по которой маршрутизация работает только на контроллере и уровне просмотра приложения? Я могу вспомнить множество случаев, когда коду модели может потребоваться URL-адреса (интеграция с внешними системами и т. Д.).