I metodi in application controller

…possono essere richiamati da qualsiasi altro controller?
Nella mia applicazione ho:
.
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter CASClient::Frameworks::Rails::Filter

private

def find_operator_name
operator ||= session[:cas_user] &&
Operator.find_by_uid([session[:cas_user]])
@_operator = operator.full_name
end
end

Questo per avere a disposizione il nome dell’operatore per tutta
l’applicazione.
Da un altro controller faccio

before_filter :find_operator_name, :except =>[:show]

Sembra funzionare presumo quindi che l’action find_operator_name possa
essere richiamata da qualsiasi controller.
Ma e’ questo il giusto modo per avere a disposizione un dato, in
questo caso il nome dell’operatore, per tutta l’applicazione?
Ho trovato questo esempio in rete, ha qualche significato particolare
l’underscore dopo il carattere “@”?

2010/9/28 Pietro G. [email protected]:

ha nessun effetto. Perché avvenga il caching, dovrebbe essere

Ma e’ questo il giusto modo per avere a disposizione un dato, in
questo caso il nome dell’operatore, per tutta l’applicazione?

Sì, direi che un before_filter è il modo giusto.

Si pero’ la variabile operator viene resa disponibile solo al
controller che fa il before_filter e non agli altri.
Forse sarebbe meglio mettere @operator.full_name in una session?

Ciao,

Il 28 settembre 2010 13:21, Mauro [email protected] ha scritto:

…possono essere richiamati da qualsiasi altro controller?
sì.

@_operator = operator.full_name
end
end

attenzione: operator è solo una variabile del metodo, quindi ||= non
ha nessun effetto. Perché avvenga il caching, dovrebbe essere
@operator.

Questo per avere a disposizione il nome dell’operatore per tutta l’applicazione.
Da un altro controller faccio

before_filter :find_operator_name, :except =>[:show]

Sembra funzionare presumo quindi che l’action find_operator_name possa
essere richiamata da qualsiasi controller.
Ma e’ questo il giusto modo per avere a disposizione un dato, in
questo caso il nome dell’operatore, per tutta l’applicazione?

Sì, direi che un before_filter è il modo giusto.
Non so se valga la pena avere una variabile che contiene solo il nome
o se è meglio usare @operator.full_name, decidilo tu; tuttavia, se
scegli di sì, chiamala almeno @operator_name, non @operator.

Attenzione anche al fatto che se chiami find_operator_name e poi,
nella stessa request, cambi session[:cas_user] e poi usi di nuovo
find_operator_name, continuerai a ricevere il valore vecchio.

Ho trovato questo esempio in rete, ha qualche significato particolare
l’underscore dopo il carattere “@”?

Che io sappia no, credo che sia d’ispirazione python (in python non
esistono metodi o variabili private, ma per convenzione le cose il cui
nome inizia per underscore sono considerate private, vale a dire, gli
altri oggetti non dovrebbero farvi affidamento a cuor leggero).

pietro - www.zephirworks.com

Il 29/09/10 09.06, Mauro ha scritto:

Il significato di operator ||= Operator.find_by_uid([session[:cas_user]])
sarebbe: se operator e’ null assegnali il valore restituito da
Operator.find_by_uid([session[:cas_user]]) altrimenti usa operator.
Sbaglio?

no, è giusto, ma dato che operator è una variabile interna al metodo, in
quella posizione sarà sempre null. se usi @operator le cose cambiano
dato che la variabile potrebbe già essere valorizzata

2010/9/28 Mauro [email protected]:

before_filter CASClient::Frameworks::Rails::Filter
attenzione: operator è solo una variabile del metodo, quindi ||= non
ha nessun effetto. Perché avvenga il caching, dovrebbe essere
@operator.

Il significato di operator ||=
Operator.find_by_uid([session[:cas_user]])
sarebbe: se operator e’ null assegnali il valore restituito da
Operator.find_by_uid([session[:cas_user]]) altrimenti usa operator.
Sbaglio?