402 Stimmen

Können Rails Routing-Helfer (d.h. mymodel_path(model)) in Modellen verwendet werden?

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.

1voto

rmontgomery429 Punkte 14390

Es mag zwar eine Möglichkeit geben, aber ich würde dazu neigen, diese Art von Logik aus dem Modell herauszuhalten. Ich stimme zu, dass man das nicht in den View packen sollte ( schlank bleiben ), aber es sei denn, das Modell ist die Rückgabe einer Url als ein Stück von Daten an den Controller, das Routing Zeug sollte in der Controller sein.

0voto

(Edit: Vergessen Sie mein vorheriges Geschwätz...)

Ok, es mag Situationen geben, in denen man entweder zum Modell oder zu einer anderen Url gehen würde... Aber ich glaube nicht, dass dies wirklich in das Modell gehört, die Ansicht (oder vielleicht das Modell) klingt mehr apropriate.

Über die Routen, so weit ich weiß, ist die Routen für die Aktionen in Controllern (die in der Regel "magisch" verwendet eine Ansicht), nicht direkt zu Ansichten. Der Controller sollte alle Anfragen verarbeiten, die Ansicht sollte die Ergebnisse präsentieren und das Modell sollte die Daten verarbeiten und es an die Ansicht oder Controller dienen. Ich habe viele Leute hier über Routen zu Modellen sprechen hören (bis zu dem Punkt, an dem ich fast anfange, es zu glauben), aber so wie ich es verstehe: Routen gehen zu Controllern. Natürlich sind viele Controller Controller für ein Model und werden oft als <modelname>sController (z. B. ist "UsersController" der Controller des Modells "User").

Wenn Sie feststellen, dass Sie unangenehme Mengen an Logik in einer Ansicht schreiben, sollten Sie versuchen, die Logik an eine geeignetere Stelle zu verlagern; Anforderungs- und interne Kommunikationslogik gehört wahrscheinlich in den Controller, datenbezogene Logik kann im Modell platziert werden (aber nicht in der Anzeigelogik, die Link-Tags usw. umfasst), und Logik, die nur mit der Anzeige zusammenhängt, würde in einem Helfer platziert werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X