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.
Onları nasıl geçersiniz? Örnekle düzenleme mi yapılmalı? Teşekkürler – AnApprentice
model Oturum kullanmamalı, bu pek çok düzeyde yanlış –