2009-06-15 7 views
3

Comment puis-je traiter des informations de session importantes comme s'il s'agissait d'un modèle? J'ai commencé à jouer avec ça, et certaines d'entre elles fonctionnent. Mais je ne suis pas sûr de ce qui me manque? Est-ce que quelqu'un sait un bon endroit pour commencer ou où je peux trouver de bons exemples?rails modèle de session

En outre, je peux utiliser le modèle pour définir les variables de session, mais qu'en est-il du modèle plutôt que de toujours utiliser session [: blah] ... Comment puis-je les récupérer à partir du modèle?

class Cart 
    attr_reader :items 

    def initialize(session) 
    @session = session 
    @session[:cart] ||= [] 
    @items ||= session[:cart] 
    end 

    def add_rooms(new_rooms,startdate,days) 
    #remove 0 values 
    new_rooms.delete_if {|k, v| v == "0" } 
    rooms = [] 
    new_rooms.each do |k, v| 
     #rname = Room.find(k) 
     #night = Available.find_by_room_id(k) 
     rooms << {:room_id => k, :people => v, :no_days => days, :startdate => startdate} 
    end 

    @session[:cart] = rooms 
    #@items = rooms 

    end 

end 

Répondre

1
+0

Je l'ai vu. mais il était plutôt bref sur le sujet. – holden

2

Il y a quelques précautions à prendre en compte cette approche

  1. En fonction de votre système de stockage de session, votre session peut grandir trop grand si les objets que vous mettez en sont complexes. Le magasin par défaut pour les sessions dans Rails 2.3 sont des cookies, il y aura certainement une limite imposée par le navigateur.
  2. Si votre modèle change, après le déploiement de votre application, les utilisateurs ayant d'anciennes sessions recevront des objets rassemblés à partir des anciennes définitions de modèles, afin d'obtenir des erreurs inattendues.
+0

Il n'y a pas beaucoup de choses que je veux y mettre, juste une date et quelques identifiants. Donc, je ne suis pas inquiet pour l'espace, mais il sera remplacé souvent et par différents contrôleurs. – holden

1

+1 sur le Railscast par Ryan Bates.

Ce type de chose fonctionne pour moi;

def set_order_id(i) 
    @cart_session[:order_id] = i 
    end 
    def has_order_id? 
    @cart_session[:order_id] 
    end 
    def order_id 
    has_order_id? 
    end 
1

Vous avez juste besoin d'une méthode qui renvoie les données que vous voulez de la session.

def blah 
    @session[:blah] 
end 

Si vous avez besoin de beaucoup d'entre eux, je voudrais créer un plugin qui étend la classe avec une méthode qui fonctionne de façon similaire à attr_reader. Quelque chose comme

session_reader :blah 
Questions connexes