Một số giải pháp khác ở đây có thể không hoạt động nếu biểu mẫu đăng nhập của bạn có trang riêng, thay vì, ví dụ: biểu mẫu đăng nhập trong tiêu đề của mỗi trang. Sau khi đăng nhập, người dùng cần quay lại hai trang, không chỉ một trang.
Devise có cách làm đẹp trên Redirecting back to the current page after sign in, sign out, update, từ đó mã bên dưới xuất hiện.
Lưu trữ URL gốc trong phiên là tùy chọn tốt nhất. Ngoài việc giải quyết vấn đề trên quay trở lại hai trang, "Nhiều trình duyệt không gửi tiêu đề [request.referer
]. Do đó, cách trình duyệt chéo duy nhất mạnh mẽ để triển khai chức năng này là sử dụng phiên".
Khi lưu trữ URL trong phiên, điều quan trọng là không lưu trữ URL cho bất kỳ yêu cầu POST, PUT hoặc DELETE nào cũng như bất kỳ yêu cầu XHR nào, tức là không có gì mà người dùng thực sự không thể được chuyển hướng.
Lưu ý rằng sau khi đăng xuất, phiên của người dùng sẽ bị hủy, vì vậy URL đã lưu sẽ biến mất. Trong trường hợp này, người dùng có thể được gửi trở lại request.referer
. Điều này có vẻ chấp nhận được vì hầu hết các trang web đều có liên kết đăng xuất trên mỗi trang, vì vậy việc quay lại liên kết giới thiệu sẽ thực sự hoạt động.
class ApplicationController < ActionController::Base
before_action :store_user_location!, if: :storable_location?
before_action :authenticate_user!
private
def storable_location?
request.get? && is_navigational_format? && !devise_controller? && !request.xhr?
end
def store_user_location!
store_location_for(:user, request.fullpath)
end
def after_sign_in_path_for(resource_or_scope)
stored_location_for(resource_or_scope) || super
end
def after_sign_out_path_for(resource_or_scope)
request.referrer || super
end
end
Cảm ơn @Billy trả lời của bạn .. trong khi sử dụng mã này, nó luôn luôn chuyển hướng tôi đến root_path (home page) và không có trong trang cụ thể mà tôi mở trước khi đăng nhập – Rajeev
@rubydev, làm bạn sử dụng Firefox và addon để vô hiệu hóa liên kết giới thiệu? Cũng sử dụng công cụ gỡ lỗi, nói thêm '<% = debug session =>' trong template, hoặc rails console để kiểm tra những gì đã xảy ra. –
Cảm ơn @Billy, công việc của nó bây giờ, Chỉ có một thay đổi ở đây là tôi thay đổi after_filter thành before_filter – Rajeev