Rails: dari mana "current_user" yang terkenal itu berasal?

95

Saya baru-baru ini melihat-lihat ke Rails dan memperhatikan bahwa ada banyak referensi ke current_user. Apakah ini hanya datang dari Devise? dan apakah saya harus mendefinisikannya sendiri secara manual meskipun saya menggunakan Rancangan? Apakah ada prasyarat untuk menggunakan current_user(seperti keberadaan sesi, pengguna, dll)?

kentang besar
sumber

Jawaban:

84

Ini ditentukan oleh beberapa permata, misalnya Rancangan

Anda harus menyimpan user_id di suatu tempat, biasanya dalam sesi setelah masuk. Ini juga mengasumsikan aplikasi Anda memiliki dan membutuhkan pengguna, otentikasi, dll.

Biasanya, itu seperti:

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

Ini mengasumsikan bahwa kelas Pengguna ada, misalnya #{Rails.root}/app/models/user.rb.

Diperbarui: hindari kueri database tambahan saat tidak ada pengguna saat ini.

Erik Peterson
sumber
Apakah sesi semacam itu seperti pengontrol / model yang umum digunakan untuk tujuan mengontrol status login pengguna? atau apakah itu dibangun menjadi rel?
kentang besar
sessiondibangun ke dalam Rails. Secara default, ini menggunakan cookie untuk mempertahankan status klien di antara permintaan. Lihat guide.rubyonrails.org/security.html#sessions untuk info selengkapnya.
Erik Peterson
2
CATATAN: Jika Anda membaca jawaban ini, pastikan untuk memasukkan return unless session[:user_id]seperti yang ditunjukkan dalam jawaban Zach - tanpa itu, setiap if current_usercek saat keluar akan memicu kueri database lain.
DreadPirateShawn
10

Ya, current_usergunakan session. Anda dapat melakukan sesuatu yang serupa di pengontrol aplikasi Anda jika Anda ingin menggulung otentikasi Anda sendiri:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end
Zach Kemp
sumber
Apakah sesi semacam itu seperti pengontrol / model yang umum digunakan untuk tujuan mengontrol status login pengguna? atau apakah itu dibangun menjadi rel?
kentang besar
1
sessionadalah semacam suka params, kecuali itu tetap ada untuk beberapa permintaan. Anda dapat menggunakannya untuk menyimpan segala jenis parameter tetap yang unik untuk setiap pengguna Anda (hingga sesi mereka berakhir atau mereka keluar). Anda dapat membaca lebih lanjut di sini: ActionController: Accessing the Session
Zach Kemp