Rails and Devise:成功登录后如何将用户重定向回请求的页面?

Posted

技术标签:

【中文标题】Rails and Devise:成功登录后如何将用户重定向回请求的页面?【英文标题】:Rails and Devise: How to redirect user back to the requested Page after successful login? 【发布时间】:2021-07-24 08:29:41 【问题描述】:

我使用的是https://guides.rubyonrails.org/v2.3/action_controller_overview.html#other-ways-to-use-filters中描述的成语

# /app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_filter do |controller|
    redirect_to new_login_url unless controller.send(:logged_in?)
  end
end

现在如果登录过程成功了,如何

    我可以检查一下,b) 如何将用户重定向到请求的控制器操作? 如何通过 AJAX 和 JSON 进行此登录过程?

编辑:我也收到以下错误消息

uninitialized constant ApplicationController::LoginFilter 

当我使用6.2 Other Ways to Use Filters 中建议的更精细的解决方案而不是上面的解决方案时,我的控制器看起来像这样

# /app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :set_return_path, LoginFilter

  def set_return_path
    return if devise_controller?
    session['user_return_to'] = request.url unless current_user
  end

  class LoginFilter

    def self.filter(controller)
      unless controller.send(:logged_in?)
      controller.flash[:error] = "You must be logged in"
      controller.redirect_to controller.new_login_url
    end

   end
  end   
end

谢谢

冯·斯波茨

【问题讨论】:

【参考方案1】:

您可以在保存请求页面网址的application_controller.rb 中添加before_action

class ApplicationController < ActionController::Base
  before_action :set_return_path

  def set_return_path
    return if devise_controller?

    session['user_return_to'] = request.url unless current_user
  end
end

然后用户登录成功后重定向到这个url:

class SessionsController < Devise::SessionsController
 
  def after_sign_in_path_for(resource)
    return root_url if session['user_return_to'].blank?

    session['user_return_to']
  end
end

【讨论】:

非常感谢! “还有 2 条路要走” @vonspotz 您可以检查控制器中的current_user 变量,如果设置了则表示用户已登录。如果是nil,则表示用户未登录。 请 Sachin,告诉我,这个 SessionController 在哪里?显然,我阅读的教程并没有涵盖这一点。祝你好运! SessionsController 是 UsersController 的替代品吗? @vonspotz SessionsController 是devise gem 的控制器,在这里您需要覆盖after_sign_in_path_for 方法定义。它可以完全按照我在示例中定义控制器的方式完成。

以上是关于Rails and Devise:成功登录后如何将用户重定向回请求的页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Rails 控制台使用 Devise 登录用户?

Rails & Devise:如何在没有布局的情况下呈现登录页面?

在 Rails 4 上登录后,ngrok、pow 和 devise 会导致重定向到本地 URL

每次使用 Rails 3 中的 Devise 登录时,如何检查用户帐户?

Rails 3 using Devise:如何允许某人使用他们的 Facebook 帐户登录?

devise 和 rspec-rails - 如何在请求类型规范(带有 type: :request 标记的规范)中登录用户?