2011-03-18 14 views
5

mod_passenger ile Apache üzerinde dağıtılan bir Raylar v2.3.8 app bakımı içinde geçerli kullanıcı oturumunu erişenRaylar:. Bir model (

ben tam olarak modellerinden biri (bir Denetçi gözlemci de geçerli kullanıcı oturumu erişmesi gereken) Bu MVC prensibini kırdığını biliyorum ama şu anda oturum açmış olan kullanıcıyı bilmesi gereken bir gözlemciye sahip olduğum için onu ihlal etmeliyim.Çok kontrolör var ve aramayı Auditor logger'ına yerleştirmek çok fazla DRY olmayacaktı. sadece şu anda kullanıcı oturumunda oturum ile User.current arama yapabilmek için çalışıyorum

Ancak önbelleğe alma/iş parçacığı güvenliği ile ilgili bir sorun koştum ettik. döndü. asıl yazar (bir sınıf değişkeni kullanılan @@ geçerli kullanıcı. Ama bu iş parçacığı güvenli değil, bu yüzden bu Bu yüzden iş parçacığı güvenli olmalıdır. Ve denetçi gözlemcisinde bir çağrım var: Kullanıcı.current'ı konu olarak geçtiğim yer.

Bu kod geliştirme konusunda harika çalışıyor, ancak üretimlerimde User.current öğesinden yanlış değerler alıyorum. Bazen başka bir kullanıcı kaydına giriyorum, şimdiki kaydı değil. Bu yüzden hala var olan bazı iş parçacığı güvenliği/sınıf önbelleği sorunu var, ancak bunu nasıl düzelteceğimi anlayamıyorum.

Herhangi bir öneriniz var mı? Teşekkürler

cevap

3

ActiveRecord ve ActionPack tamamen farklıdır, bu nedenle modellerde oturum/tanımlama bilgilerine erişemezsiniz. Mevcut kullanıcıya ihtiyacınız varsa iki seçeneğiniz vardır.

Seçenek 1 - denetleyicisi modeli

geçerli kullanıcı Pass:

def index 
    Audit.get_current_user(current_user) 
    #where audit is your model that you will send the current_user to 
end 

Seçenek 2 - Bir kullanıcı nesnesi değiştirildikten sonra işlem gerçekleştiren bir kullanıcı modeli var. Kullanıcı modelinde

: Ben evreli vardır akım alıcı/ayarlayıcı yöntemi oluşturulduğunda neden

before_save :adjust_user 

def adjust_user 
    #self will be the object that was just modified aka the current user 
end 
+0

, benim geçerli kullanıcı/saklamak elde etmek izin verir. Sorun, User.current'ın önbelleğe alındığı çağrılarıyla ortaya çıkıyor (bence). – Swartz

+0

Seçenek 1 için: current_user'yi doğrudan denetleyici yönteminden geçirebilirim, neden get_current_user() neden gerektiğinden emin değilim. Ancak, özellikle bu tür bir çağrı gerektiren çok sayıda nokta olduğu için denetçiden Auditor() 'a çok çağrı yapılmasını istemiyorum. Gözlemci çok daha temiz çalışır. – Swartz

+0

Seçenek 2 için: Seni takip etmiyorum ... Kullanıcı nesnesi değiştirilen tek şey değil. Oturum açan kullanıcının değiştirebileceği çeşitli nesnelerim var (Politika, İzin, vb. Gibi). Denetçiyi bir etkinlik kayıt defteri olarak düşünün. Kullanıcılar CRUD politikaları, izinleri, vb. Olabilir. Bu yüzden hala current_user'yi Auditor modeline geçirmem gerekiyor. – Swartz

İlgili konular