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.).
quelle
Antworten:
In den Schienen 3, 4 und 5 können Sie Folgendes verwenden:
z.B
quelle
:host
Option überall und legen Sie sie einmal in Ihren Umgebungskonfigurationsdateien fest:Rails.application.routes.default_url_options[:host] = 'localhost:3000'
include Rails.application.routes.url_helpers
funktioniert für mich in Rails 4.1Ich habe die Antwort gefunden, wie ich das selbst machen soll. Fügen Sie im Modellcode einfach Folgendes ein:
Für Schienen <= 2:
Für Schienen 3:
Dadurch wird auf magische Weise
thing_path(self)
die URL für das aktuelle Objekt oderother_model_path(self.association_to_other_model)
eine andere URL zurückgegeben.quelle
include Rails.application.routes.url_helpers
Möglicherweise finden Sie auch den folgenden Ansatz sauberer als jede Methode einzuschließen:
quelle
undefined local variable or method 'url_helpers' for Event:Class
Fehlermeldung ... :(undefined method url_helpers
. Was werde ich tun?class
, wie in der Antwort gezeigt. Wenn Ihre Modellklasse bereits erweitert< ApplicationRecord
ist, funktioniert dies nicht?Jede Logik, die mit dem zu tun hat, was in der Ansicht angezeigt wird, sollte an eine Hilfsmethode delegiert werden, da die Methoden im Modell ausschließlich für den Umgang mit Daten vorgesehen sind.
Folgendes können Sie tun:
quelle
Ich mag es wirklich, einer sauberen Lösung zu folgen.
Es ist von http://hawkins.io/2012/03/generating_urls_whenever_and_wherever_you_want/
quelle
Es könnte zwar einen Weg geben, diese Art von Logik aus dem Modell herauszuhalten. Ich bin damit einverstanden, dass Sie dies nicht in die Ansicht einfügen sollten ( halten Sie es dünn ), aber wenn das Modell keine URL als Datenelement an den Controller zurückgibt, sollte sich das Routing-Material im Controller befinden.
quelle
(Edit: Vergiss mein vorheriges Geschwätz ...)
Ok, es könnte Situationen geben, in denen Sie entweder zum Modell oder zu einer anderen URL wechseln ... Aber ich glaube nicht, dass dies zum Modell gehört, die Ansicht (oder vielleicht das Modell) klingt angemessener.
Über die Routen, soweit ich weiß, beziehen sich die Routen auf die Aktionen in Controllern (die normalerweise "magisch" eine Ansicht verwenden), nicht direkt auf Ansichten. Der Controller sollte alle Anforderungen verarbeiten, die Ansicht sollte die Ergebnisse präsentieren und das Modell sollte die Daten verarbeiten und sie der Ansicht oder dem Controller bereitstellen. Ich habe hier viele Leute ü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 an Controller. Natürlich sind viele Controller Controller für ein Modell und werden oft genannt
<modelname>sController
(z B. "UsersController" ist der Controller des Modells "User").Wenn Sie in einer Ansicht unangenehme Mengen an Logik schreiben, versuchen Sie, die Logik an einen geeigneteren Ort zu verschieben. Anforderungs- und interne Kommunikationslogik gehören wahrscheinlich in die Steuerung, datenbezogene Logik kann in das Modell eingefügt werden (aber keine Anzeigelogik, die Verbindungs-Tags usw. enthält), und Logik, die rein anzeigebezogen ist, würde in einen Helfer eingefügt.
quelle