Rails: “current_user” khét tiếng đến từ đâu?


94

Gần đây tôi đã tìm hiểu về Rails và nhận thấy rằng có rất nhiều tài liệu tham khảo current_user. Điều này chỉ đến từ Devise? và tôi có phải tự định nghĩa nó theo cách thủ công ngay cả khi tôi sử dụng Devise không? Có các điều kiện tiên quyết để sử dụng current_user(như sự tồn tại của phiên, người dùng, v.v.) không?

Câu trả lời:


81

Nó được xác định bởi một số viên ngọc, ví dụ như Devise

Bạn sẽ cần lưu trữ user_id ở đâu đó, thường là trong phiên sau khi đăng nhập. Nó cũng giả định rằng ứng dụng của bạn có và cần người dùng, xác thực, v.v.

Thông thường, nó giống như:

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

Điều này giả định rằng lớp người dùng tồn tại, ví dụ #{Rails.root}/app/models/user.rb.

Đã cập nhật: tránh các truy vấn cơ sở dữ liệu bổ sung khi không có người dùng hiện tại.


Phiên có giống như một bộ điều khiển / mô hình thường được sử dụng nhằm mục đích kiểm soát trạng thái đăng nhập của người dùng không? hoặc nó được xây dựng trong đường ray?
bigpotato

sessionđược tích hợp vào Rails. Theo mặc định, nó sử dụng cookie để duy trì trạng thái của khách hàng giữa các yêu cầu. Xem Guide.rubyonrails.org/security.html#sessions để biết thêm thông tin.
Erik Peterson

2
LƯU Ý: Nếu bạn đang đọc câu trả lời này, hãy đảm bảo bao gồm return unless session[:user_id]như được hiển thị trong câu trả lời của Zach - nếu không có điều đó, mỗi lần if current_userkiểm tra khi đăng xuất sẽ kích hoạt một truy vấn cơ sở dữ liệu khác.
DreadPirateShawn

10

Có, current_usersử dụng session. Bạn có thể làm điều gì đó tương tự trong bộ điều khiển ứng dụng của mình nếu bạn muốn triển khai xác thực của riêng mình:

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

Các phiên có giống như một bộ điều khiển / mô hình thường được sử dụng nhằm mục đích kiểm soát trạng thái đăng nhập của người dùng không? hoặc nó được xây dựng trong đường ray?
bigpotato

1
sessiongiống như params, ngoại trừ nó vẫn tồn tại cho nhiều yêu cầu. Bạn có thể sử dụng nó để lưu trữ bất kỳ loại thông số liên tục nào duy nhất cho người dùng cá nhân của bạn (cho đến khi phiên của họ hết hạn hoặc họ đăng xuất). Bạn có thể đọc thêm về nó ở đây: ActionController: Truy cập vào phiên
Zach Kemp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.