Angenommen, ich habe ein Rails-Modell namens Thing. Thing verfügt über ein URL-Attribut, das optional irgendwo im Internet auf eine URL festgelegt werden kann. Im Ansichtscode benötige ich eine Logik, die Folgendes bewirkt:
<% 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 dahingehend ändern würde:
<%= 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äre der Ansichtscode:
<%= link_to('Text', thing.link) %>
Dies würde offensichtlich eine Verknüpfungsmethode für das Modell erfordern. Folgendes müsste es enthalten:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Bis zur Frage ist thing_path () eine undefinierte Methode im Modellcode. Ich gehe davon aus, dass es möglich ist, einige Hilfsmethoden in das Modell zu "ziehen", aber wie? Und gibt es einen wirklichen Grund dafür, dass das Routing nur auf dem Controller und den Ansichtsebenen der App ausgeführt wird? Ich kann mir viele Fälle vorstellen, in denen Modellcode möglicherweise mit URLs umgehen muss (Integration in externe Systeme usw.).