[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