2012-05-14 5 views
6

Questo sta per sembrare strano, ma mi sento fuori ... ho bisogno di essere in grado di fare l'equivalente di una richiesta POST ad uno dei miei altri controller. Lo SimpleController è fondamentalmente una versione semplificata di un controller più dettagliato. Come posso farlo in modo appropriato?Rails: Come eseguire il POST internamente a un'altra azione del controller?

class VerboseController < ApplicationController 
    def create 
    # lots of required params 
    end 
end 

class SimpleController < ApplicationController 
    def create 
    # prepare the params required for VerboseController.create 
    # now call the VerboseController.create with the new params 
    end 
end 

Forse sto pensando troppo, ma non so come farlo.

+1

Sei certo bisogno di questo? Non sarebbe più appropriato creare verbose come metodo Model? –

+5

È fantastico che tutti dicano che non dovrebbe essere fatto, ma a volte è necessario farlo. Ad esempio, per ripristinare i dati POST dopo l'autenticazione, ecc –

+0

@TheDoctorWhat Ripristino dei dati POST dopo l'autenticazione è probabilmente l'unico * * caso in cui qualcosa di simile avrebbe senso, e anche lì, mi piacerebbe cercare un approccio diverso. Certamente non ha senso nel contesto in cui è stata posta la domanda. –

risposta

7

comunicazione Inter-controllore in un'applicazione Rails (o qualsiasi applicazione web, seguendo lo stesso schema modello di adattatore-view per questo) è qualcosa che si dovrebbe evitare attivamente. Quando sei tentato di farlo, considera un segno che stai combattendo i pattern e il framework su cui è basata la tua app e che stai facendo affidamento sulla logica implementata nel livello sbagliato della tua applicazione.

Come @ismaelga suggerito in un commento; entrambi i controller dovrebbero invocare alcuni componenti comuni per gestire questo comportamento condiviso e mantenere i controller "magri". In Rails è spesso un metodo su un oggetto modello, in particolare per il tipo di comportamento di creazione che in questo caso sembra essere preoccupato.

3

Non dovrebbe fare questo. Stai creando un modello? Quindi avere due metodi di classe sul modello sarebbe molto meglio. Separa anche il codice molto meglio. Quindi è possibile utilizzare i metodi non solo nei controller ma anche nei lavori in background (ecc.) In futuro.

Per esempio, se si sta creando una Persona:

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

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

Poi nel modello persona si potrebbe andare in questo modo:

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 

Spero che questo possa aiutare un po '. :-)

+1

Cosa succede se si desidera reindirizzare a un altro 'azione:: create' in modo da poter creare un altro modello? – mbigras

Problemi correlati