2012-02-17 8 views
11

Ho un controller di rotaie con due azioni definite: index e show. Ho una variabile di istanza definita nell'azione index. Il codice è qualcosa di simile di seguito:La stessa variabile di istanza per tutte le azioni di un controller

def index 
    @some_instance_variable = foo 
end 

def show 
    # some code 
end 

Come posso accedere al @some_instance_variable in show.html.erb modello?

risposta

10

A meno che non si esegua il rendering di show.html.erb dall'azione index, sarà necessario impostare @some_instance_variable anche nell'azione di visualizzazione. Quando viene richiamata un'azione del controllore, richiama il metodo di corrispondenza, pertanto il contenuto del metodo index non verrà chiamato quando si utilizza l'azione show.

Se è necessario @some_instance_variable insieme alla stessa cosa in entrambe le azioni index e show, il modo corretto sarebbe quello di definire un altro metodo, chiamato da entrambi index e show, che imposta la variabile di istanza.

def index 
    set_up_instance_variable 
end 

def show 
    set_up_instance_variable 
end 

private 

def set_up_instance_variable 
    @some_instance_variable = foo 
end 

Rendere il set_up_instance_variable metodo privato impedisce di essere chiamato come un'azione di controllo se si dispone di percorsi jolly (vale a dire, match ':controller(/:action(/:id(.:format)))')

+1

Grazie a Emily. Ma c'è un modo DRY-er per farlo? – Red

+0

Grazie a Emily stavo cercando lo stesso. Saluti! – Aashish

+0

Basta aggiungere 'before_action: set_up_instance_variable, solo: [: show,: index]' al controller. Ciò eseguirà 'set_up_instance_variable 'prima di qualsiasi azione specificata. – domi91c

52

È possibile definire variabili di istanza per più azioni utilizzando un filtro di prima, ad es .:

class FooController < ApplicationController 
    before_filter :common_content, :only => [:index, :show] 

    def common_content 
    @some_instance_variable = :foo 
    end 
end 

Ora @some_instance_variable sarà accessibile da tutti i modelli (compresi i parziali) resi dagli index o show azioni.

+4

Questa è una risposta migliore! –

+0

Molto ASCIUTTO. Bello! – Red

+0

@Mori In che modo decidi se posizionare il metodo/oggetto in uno spazio privato o protetto o pubblico? Thks! – Red

Problemi correlati