[ruby-it] Variabili d'istanza non visibili
Simone Carletti
weppos a gmail.com
Mar 25 Ago 2009 11:36:43 CEST
Un filtro in before_filter lavora nel contesto dell'istanza. Quindi ogni
filtro ha visibilità delle istanze create dai filtri precedenti ed ogni
azione ha visibilità delle istanze create da un qualsiasi filtro.
class MyController
before_filter :load_user
def action
# qui @user == :me
end
protected
def load_user
@user = :me
end
end
I tuoi due filtri, dunque, sembrano corretti, fermo restando che non mi
quadra quel return nil al fine del secondo filtro.
Controlla solo che i filtri vengano eseguiti nell'ordine che ti aspetti,
altrimenti le variabili non le avrai a disposizione. Invece che un filtro,
potresti usare un metodo e sfruttare il lazy loading per avere la variabile
a disposizione esattamente dove e quando ti serve.
class ApplicationController
protected
def current_session
@user_session ||= UserSession.new(session)
end
def current_user
# evita if quando non servono e soprattutto
# evita di usare if come "patch" per nil exception
# può un UserSession.new mai tornare nil?
# e se lo torna, è veramente corretto?
@current_user = current_session.get_logged_user
end
end
class MyController < ApplicationController
def alpha
# qui non chiamo mai user session quindi risparmio risorse e filtri
end
def beta
@stuff = current_user.do_stuff
end
end
Se infatti guardi il funzionamento di Authlogic, a scopo didattico, vedrai
che funziona esattamente in questo modo.
Hai un metodo, che può essere usato anche come before_filter, che imposta
una variabile current_user che puoi richiamare nell'azione o nel template
corrente.
-- Simone
2009/8/25 Nicola Nico <theonenkl a gmail.com>
> per pietro:
>
> Ok, ho fatto un'altra prova e ho visto che le variabili posso
> dichiararle anche in altri metodi, e sono comunque visibili.. Chissà
> come avevo provato prima
>
> per simone:
>
> forse ho intuito dove sta il problema. l'istanza della classe viene
> creata nell'Application, in questo modo
>
> before_filter :initialize_session
> def initialize_session
> @user_session ||= UserSession.new(session)
> end
>
> before_filter :fetch_logged_in_user
> def fetch_logged_in_user
> if @user_session
> @current_user = @user_session.get_logged_user
> end
>
> return nil
> end
>
> La classe che deve contenere la variabile è UserSession
> Poi uso @user_session dove voglio (in teoria), per impostare la
> sessione. Forse il problema è dato dal before_filter. Io vorrei che
> venisse creata un'istanza di UserSession una tantum per gestire le
> sessioni dell'utente corrente.
> --
> Posted via http://www.ruby-forum.com/.
> _______________________________________________
> Ml mailing list
> Ml a lists.ruby-it.org
> http://lists.ruby-it.org/mailman/listinfo/ml
>
--
Simone Carletti
Site & Blog: http://www.simonecarletti.com
Email: weppos a weppos.net
LinkedIn: http://linkedin.com/in/weppos
Nick: weppos | Skype: weppos
More information about the Ml
mailing list