2011-08-27 27 views
15

Rails 3 ile,Modelde Oturum Değişkeni Ayarlama

session[:cannot_reason] = "no such item" 

modelinde bir oturum değişkenini nasıl ayarlayabilirsiniz. Yukarıdakileri kullanıcı modelimde ayarlamak istiyorum. Şu anda bu hatayı alıyorum:

undefined local variable or method `session' for #<User:0x00000102eb9c38> 

Fikirler? Teşekkürler

cevap

30

yılında

class User < ... 
    def item_status 
    return :no_such_item 
    end 
end 

modelleri oturum verilerine erişim sahibi olup olmadığını ilgili bazı gereksiz yük-culting var. Bence bu aptalca, çünkü oturum gerçekten başka bir kalıcı depolama alanı (çok daha kısa bir zaman dilimi için de olsa) ve Rails'de, etki alanı nesnesinin de kendini sürdürebilmesi iyi görünüyor. söyleniyor

, üzerinde çalışacaktır Kullanıcı yöntem haline parametre olarak oturum karma geçmek olacaktır yapmamaya çok temiz yolu: Kumandanızda olarak

class User < ... 
    def mymethod(session, count) 
    session[:count] = count 
    end 
end 

, daha sonra olur böyle bir şey yapmak: mymethod bazı iş mantığı uygulamakta olduğunu hayal

def update 
    # ... 
    user.mymethod(session, count) 
end 

, bu uygun session karma değiştirecektir. session hash değerini denetleyiciye geri göndermeniz gerekmez; Ruby, nesnelerdeki başvuruları (Hash gibi) iletir - başvurulan nesneler için yapılan değişiklikler tadilatsal olarak yapılır.

Tavsiye edilen bir kelime: Yukarıdaki örnek, bence, kokulu. Bunun nedeni, User'un bir veritabanı için varlığını sürdürdüğü bir ActiveRecord modelidir ve bir oturum çerezi için de geçerli olmasını sağlayan bir davranış ekliyoruz. Bana göre bu, SRP'yi ihlal ediyor ve bundan kaçınılmalıdır.

Bunu gerçekleştirmemin yolu, oturum depolama mantığını, varlığının nedenini kapsülleyen ayrı bir etki alanı nesnesine çıkarmak olabilir. Belki, örneğin, count sadece bir "sayım" değil, kullanıcının geçici sepetindeki toplam öğe sayısıdır.

def update 
    # ... 
    TemporaryCart.new(session).add_item 
end 

Bu çok daha açıklayıcı olduğunu ve oturum depolama çok kullanarak kendiniz bulursanız dışarı soyut oturumu erişim koduna bariz bir şekilde kapıyı açar:

class TemporaryCart 
    def initialize(session) 
    @session = session 
    end 

    def add_item 
    # ... other item adding logic 
    @session[:temporary_cart][:num_items] += 1 
    end 
end 

Şimdi kontrolör şu şekilde görünecektir . Ayrıca, oturum karesindeki verileri adlandırdığımı (ancak bu uygulamayı göstermediğimi) fark ettim. Bunu yapmanı öneririm, böylece başka veriler eklerken kendi ayak parmaklarınıza basmazsınız.

7

Kısacası, yapamazsınız. Tasarım gereği, modellerin çerezlere ve oturuma erişimi yoktur. Oturumdaki öğelere modelinizden erişirseniz, bunları denetleyiciden açıkça almanız gerekir.

+2

Onları nasıl geçersiniz? Örnekle düzenleme mi yapılmalı? Teşekkürler – AnApprentice

+4

model Oturum kullanmamalı, bu pek çok düzeyde yanlış –

5

Oturum nesnesi modellerde görünmez. Ya modelinizdeki bir yönteme (IMHO bad) bir parametre olarak aktarın veya modelinizde istediğinizi döndüren bir yöntem tanımlayın ve ardından oturumu (denetleyicinizden) saklayın. Kumandanızda

session[:item_status] = current_user.item_status 
İlgili konular