# I metodi in application controller

**URL:** <https://www.ruby-forum.com/t/i-metodi-in-application-controller/195699>\
**Category:** IT\
**Created:** [September 28, 2010, 1:22pm UTC](https://www.ruby-forum.com/t/i-metodi-in-application-controller/195699 "2010-09-28T13:22:07Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [September 28, 2010, 1:22pm UTC](https://www.ruby-forum.com/t/i-metodi-in-application-controller/195699/1 "2010-09-28T13:22:07Z")

</div>

…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 “@”?

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [September 28, 2010, 2:53pm UTC](https://www.ruby-forum.com/t/i-metodi-in-application-controller/195699/2 "2010-09-28T14:53:27Z")

</div>

2010/9/28 Pietro G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > 
> 
> 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?

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [September 28, 2010, 2:26pm UTC](https://www.ruby-forum.com/t/i-metodi-in-application-controller/195699/3 "2010-09-28T14:26:30Z")

</div>

Ciao,

Il 28 settembre 2010 13:21, Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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](http://www.zephirworks.com)

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [September 29, 2010, 10:28am UTC](https://www.ruby-forum.com/t/i-metodi-in-application-controller/195699/4 "2010-09-29T10:28:59Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [September 29, 2010, 9:07am UTC](https://www.ruby-forum.com/t/i-metodi-in-application-controller/195699/5 "2010-09-29T09:07:02Z")

</div>

2010/9/28 Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > > 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?
