Rails: Kötü şöhretli "current_user" nereden geliyor?


95

Son zamanlarda Rails'e baktım ve çok fazla referans olduğunu fark ettim current_user. Bu sadece Devise'den mi geliyor? ve Devise kullansam bile bunu kendim manuel olarak tanımlamam gerekir mi? Kullanılması gereken ön koşullar var mı current_user(oturumların, kullanıcıların vb. Varlığı gibi)?

Yanıtlar:


84

Çeşitli mücevherlerle tanımlanır, örneğin Devise

Kullanıcı kimliğini, genellikle oturum açtıktan sonra oturumda bir yerde saklamanız gerekir. Ayrıca, uygulamanızın kullanıcılara, kimlik doğrulamasına vb. Sahip olduğunu ve buna ihtiyaç duyduğunu varsayar.

Genellikle şöyle bir şeydir:

class ApplicationController < ActionController::Base
  def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
  end
end

Bu, User sınıfının var olduğunu varsayar, örn #{Rails.root}/app/models/user.rb.

Güncellenmiş: mevcut kullanıcı olmadığında ek veritabanı sorgularından kaçının.


Oturumlar, bir kullanıcının oturum açma durumunu kontrol etmek amacıyla yaygın olarak kullanılan bir denetleyiciye / modele benziyor mu? yoksa rayların içine mi yerleştirilmiş?
bigpotato

sessionRails'te yerleşiktir. Varsayılan olarak, bir müşterinin istekler arasında durumunu korumak için bir çerez kullanır. Daha fazla bilgi için guides.rubyonrails.org/security.html#sessions adresine bakın .
Erik Peterson 04

2
NOT: Bu yanıtı okuyorsanız return unless session[:user_id], Zach'in yanıtında gösterildiği gibi eklediğinizden emin olun - bu olmadan, if current_useroturum kapalıyken yapılan her kontrol başka bir veritabanı sorgusunu tetikleyecektir.
DreadPirateShawn

10

Evet, current_userkullanır session. Kendi kimlik doğrulamanızı kullanmak istiyorsanız, uygulama denetleyicinizde benzer bir şey yapabilirsiniz:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end

Oturumlar, bir kullanıcının oturum açma durumunu kontrol etmek amacıyla yaygın olarak kullanılan bir denetleyiciye / modele benziyor mu? yoksa rayların içine mi yerleştirilmiş?
bigpotato

1
sessionparamsbirden çok istek için devam etmesi dışında bir tür benzer . Bireysel kullanıcılarınıza özel her türlü kalıcı parametreyi depolamak için kullanabilirsiniz (oturumları sona erene veya çıkış yapana kadar). Bununla
Zach Kemp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.