2010-04-26 7 views
9

Quando è stata richiamata un'azione in un controller, è possibile chiamare un'altra azione da tale azione?Posso chiamare un'azione in un'altra azione (in un controller di rotaie)?

E cosa succederebbe se entrambe le azioni avessero qualche template da rendere?

+0

Se si deve fare questo, ricordarsi di mettere il metodo chiamato dietro 'private', a meno che non sia un percorso pubblicamente disponibile a destra –

risposta

14

Sì, è possibile, se è nello stesso controller.

La chiamata zoo fornirà il modello per zoo con istanze per @x e @a. Né foo o barra saranno resi. Se hai impostato in modo esplicito un metodo render, potresti ottenere un doppio errore di rendering, a meno che non sia return prima che venga chiamato il secondo rendering.

def foo 
    @x = 1 
end 

def bar 
    @a = 2 
end 

def zoo 
    foo 
    bar 
end 
+0

se imposto esplicitamente un metodo di rendering in' bar ', quindi quando' zoo ' è chiamato, renderà il modello della barra (es. bar.html.erb)? – Bat

+0

Sì, ma dovrai 'ritornare barra' in' zoo', altrimenti otterrai un errore DoubleRender. Probabilmente stai meglio astrarre la logica condivisa tra 'bar' e' zoo' in un metodo protetto. –

+0

Grazie mille, amico! – Bat

0

È possibile utilizzare redirect_to per chiamare un'altra azione all'interno del controller. Per eseguire il rendering di un modello all'interno di un altro, è possibile utilizzare partial e/o layout.

+3

'redirect_to' non chiama l'altra azione (nel senso del metodo di chiamata), ma dice al browser di richiedere l'altra azione. Le azioni sono solo metodi, che vengono chiamati da 'ActionController' quando gestisce una richiesta. Possono essere chiamati da altre azioni come @TheWho mostra. –

0

Chi è corretto su come chiamare le azioni, ma se si sta chiamando un'azione all'interno di un'azione è necessario rifattorizzare il codice per estrarre la logica che fa ciò che si sta tentando di compiere nella propria azione, quindi consentendo a ciascuna azione di rendere il proprio modello.

-1

Sì, è possibile farlo. E se si potrebbe probabilmente fare un nullo un layout in modo che verrà visualizzato nel vostro punto di vista in un bel modo

dire (questo esempio che segue ha il 'mio_controllore' come il layout)

class my_controller < application_controller 

    def my_parent_method 
    @text_from_my_child_method = child_method 
    end 

    def child_method 
    return 'hello from child_method' 
    render :layout => false #here we are making the child_method layout false so that it #will not effect the parent method 
    end 

end 

e nella vostra 'my_parent_method.rhtml' (vista) è possibile utilizzare la variabile

<%= @text_from_my_child_method %> and it should print 'hello from child_method' 

speranza che questo aiuta

applausi, sameera

+2

Il 'render' non sarà mai chiamato in' child_method'. Stai 'ritornando fuori dal metodo prima che la riga' render' sia eseguita. Stai cercando di mostrare che 'child_method' non renderà una vista? (Che potrebbe essere reso concreto dichiarando 'child_method' come' private'.) –

-1

Se si vuole farlo perché c'è una sorta di codice comune in entrambe le azioni, forse è meglio refactoring questo codice in un before_filter.

Problemi correlati