Ich muss die Erstellungsaktion in Controller A von Controller B aus aufrufen.
Der Grund ist, dass ich anders umleiten muss, wenn ich von Controller B aus anrufe.
Kann es in Rails gemacht werden?
ruby-on-rails
ddayan
quelle
quelle
Antworten:
Sie können eine Umleitung zu dieser Aktion verwenden:
Mehr dazu: Rails Guide
So rendern Sie einfach die neue Aktion:
quelle
render
stattdessen seinredirect_to
. Was sagst du, @Spyros?redirect_to
erlaubt nicht zu verwendenpost: :method
und dies kann besonders nützlich sein, um zu einer bereits vorhandenencreate
Aktion eines anderen Controllers umzuleiten, wie @ddayan beim ersten Mal gefragt hat. Ich habe eine ähnliche Situation, in der ich in einer bestimmten Situation ein anderes Objekt erstellen sollte. Das Aufrufen der anderencreate
Aktion kann DRYer sein ..Gehen Sie folgendermaßen vor, um einen Controller von einem anderen zu verwenden:
quelle
controller_you_want
, tun Sie diescontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)
scheint zu funktionieren, um JSON vom anderen Controller zurückzugebencontroller_you_want.request
aber nicht in der Lage waren, diese Auslösung durch eine Hash- oder Parameterinstanz zu bringen.params
werden verfügbarcontroller_you_want
durch Einstellen derrequest
in der 3. Zeile. Fragen Sie das?render html: controller_you_want.process(:action_you_want)
Die von Ihnen präsentierte Logik ist nicht MVC, dann nicht Rails-kompatibel.
Ein Controller rendert eine Ansicht oder leitet um
Eine Methode führt Code aus
Aufgrund dieser Überlegungen empfehle ich Ihnen, Methoden in Ihrem Controller zu erstellen und diese aus Ihrer Aktion heraus aufzurufen.
Beispiel:
Das heißt, Sie können genau dasselbe über verschiedene Controller tun und eine Methode von Controller A aufrufen, während Sie sich in Controller B befinden.
Der Wortschatz ist extrem wichtig, deshalb bestehe ich sehr darauf.
quelle
get_variable
jetzt von einem anderen Controller aufgerufen werden?Sie können verwenden
url_for
, um die URL für einen Controller und eine Aktion abzurufen und dannredirect_to
zu dieser URL zu wechseln.quelle
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)
ergibt sich/contorller_name/action_name?param1=val1¶m2=val2
. Siehe die DokumenteDies ist eine schlechte Praxis, um eine andere Controller-Aktion aufzurufen.
Du solltest
Meine Meinung:
Der dritte Ansatz ist der, den ich oft gemacht habe. Also werde ich ein kleines Beispiel zeigen.
Sie können also an diesen Aktionsparameter
redirect_to
senden, der ein beliebiger Pfad sein kann.quelle
/models
oder eine gewöhnliche Klasse oder ein Modul in/lib
). Das einzige Problem besteht darin, dass Ihr Controller über Instanzvariablen mit der Ansicht kommuniziert. Sie müssen diese Duplizierung auf andere Weise beheben.Vielleicht könnte die Logik in einen Helfer extrahiert werden? Helfer stehen allen Klassen zur Verfügung und übertragen keine Kontrolle. Sie können darin nach dem Namen des Controllers suchen, um zu sehen, wie er aufgerufen wurde.
quelle
Zusammensetzung zur Rettung!
Aus diesem Grund sollte man Controller so gestalten, dass sie gemeinsam genutzte und benutzerdefinierte Teile des Codes trennen, anstatt Aktionen über Controller hinweg aufzurufen. Dies hilft, sowohl das Duplizieren von Code als auch das Brechen des MVC-Musters zu vermeiden.
Obwohl dies auf verschiedene Arten geschehen kann, ist die Verwendung von Bedenken ( Zusammensetzung ) eine gute Praxis.
Hoffentlich hilft das.
quelle
Sie können eine andere Aktion innerhalb einer Aktion wie folgt aufrufen:
redirect_to action: 'action_name'
quelle
Trennen Sie diese Funktionen von den Controllern und fügen Sie sie in die Modelldatei ein. Fügen Sie dann die Modelldatei in Ihren Controller ein.
quelle