Angenommen, ich habe ein Rails-Modell namens Thing. Thing hat ein url-Attribut, das wahlweise auf eine URL irgendwo im Internet gesetzt werden. Im Ansichtscode benötige ich eine Logik, die das Folgende tut:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Diese bedingte Logik in der Ansicht ist hässlich. Natürlich könnte ich eine Hilfsfunktion erstellen, die die Ansicht in diese ändert:
<%= thing_link('Text', thing) %>
Das löst das Problem der Ausführlichkeit, aber ich würde es wirklich vorziehen, die Funktionalität im Modell selbst zu haben. In diesem Fall würde der Code der Ansicht sein:
<%= link_to('Text', thing.link) %>
Dies würde natürlich eine Verknüpfungsmethode für das Modell erfordern. Hier ist, was sie enthalten müsste:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Um auf die Frage einzugehen: thing_path() ist eine undefinierte Methode im Model-Code. Ich nehme an, dass es möglich ist, einige Hilfsmethoden in das Model "hineinzuziehen", aber wie? Und gibt es einen wirklichen Grund dafür, dass das Routing nur auf den Controller- und View-Schichten der App funktioniert? Ich kann mir viele Fälle vorstellen, in denen Modell-Code mit URLs (Integration mit externen Systemen, etc.) umgehen müssen.