2012-05-14 10 views
6

Das wird seltsam klingen, aber hören Sie mir zu ... Ich muss in der Lage sein, das Äquivalent einer POST-Anfrage zu einem meiner anderen Controller zu machen. Die SimpleController ist im Grunde eine vereinfachte Version eines ausführlicheren Controllers. Wie kann ich das richtig machen?Rails: Wie intern an eine andere Controller-Aktion POST?

Vielleicht überlege ich das, aber ich weiß nicht, wie das geht.

+1

bist du sicher, dass du das brauchst? Wäre nicht angemessener, ausführlich als Modellmethode zu erstellen? –

+5

Es ist großartig, jeder sagt, es sollte nicht getan werden, aber manchmal muss es getan werden. Zum Beispiel um POST-Daten nach der Authentifizierung wiederherzustellen usw. –

+0

@TheDoctorWhat Das Wiederherstellen von POST-Daten nach der Authentifizierung ist wahrscheinlich der * einzige * Fall, in dem so etwas Sinn macht, und selbst dort würde ich nach einem anderen Ansatz suchen. In dem Kontext, in dem die Frage gestellt wurde, ergibt das sicherlich keinen Sinn. –

Antwort

7

Intercontrollerkommunikation in einer Rails-App (oder einer Webanwendung, die demselben Modell-Adapter-Ansichtsmuster folgt) sollten Sie aktiv vermeiden. Wenn Sie versucht sind, dies zu tun, denken Sie daran, dass Sie mit den Mustern und dem Framework, auf dem Ihre App aufgebaut ist, kämpfen und dass Sie sich auf Logik verlassen, die auf der falschen Ebene Ihrer Anwendung implementiert wurde.

Wie @ismaelga in einem Kommentar vorgeschlagen; Beide Controller sollten eine gemeinsame Komponente aufrufen, um dieses gemeinsame Verhalten zu handhaben und Ihre Controller "dünn" zu halten. In Rails ist das oft eine Methode für ein Modellobjekt, vor allem für die Art des Erstellungsverhaltens, um die Sie sich in diesem Fall sorgen.

3

Sie sollten dies nicht tun. Erstellen Sie ein Modell? Dann wäre es viel besser, zwei Klassenmethoden auf dem Modell zu haben. Es trennt auch den Code viel besser. Dann können Sie die Methoden nicht nur in Controllern, sondern auch in Hintergrundjobs (etc.) einsetzen.

Zum Beispiel, wenn Sie eine Person erstellen möchten:

class VerboseController < ApplicationController 
    def create 
    Person.verbose_create(params) 
    end 
end 

class SimpleController < ApplicationController 
    def create 
    Person.simple_create(params) 
    end 
end 

Dann in der Person-Modell, das Sie weitergehen könnte:

class Person 
    def self.verbose_create(options) 
    # ... do the creating stuff here 
    end 

    def self.simple_create(options) 
    # Prepare the options as you were trying to do in the controller... 
    prepared_options = options.merge(some: "option") 
    # ... and pass them to the verbose_create method 
    verbose_create(prepared_options) 
    end 
end 

Ich hoffe, dass dies ein wenig helfen kann. :-)

+1

Was ist, wenn Sie zu einem anderen 'action:: create' umleiten möchten, damit Sie ein anderes Modell erstellen können? – mbigras

Verwandte Themen