使用 Devise 和 Rails 登录后如何将用户定向到特定页面

at.*_*at. 2 login ruby-on-rails devise ruby-on-rails-3 ruby-on-rails-3.2

当用户登录我使用 Devise 创建的特定表单时,如何将用户重定向到特定页面?关于如何在登录后重定向到特定页面,Devise 有这个 howto 页面。但是,我希望不同的表单登录到不同的目标页面。理想情况下,我可以像这样添加另一个 HTML 表单参数:

<input type="hidden" name="target" value="/dashboard"/>
Run Code Online (Sandbox Code Playgroud)

更新:重要的是我要为登录页面维护设计的正常功能。也就是说,如果我单击before_filter :authenticate_user!控制器中带有 的链接,那么我将被重定向到登录页面。登录后,我被重定向到原始目标页面。

pja*_*jam 5

实际上,您可以after_sign_in_path_for像这样简单地在控制器中定义方法:

class ApplicationController < ActionController::Base

  def after_sign_in_path_for
    params[:target] || some_default_url
  end

end
Run Code Online (Sandbox Code Playgroud)

然后,如果您的不同登录表单具有不同的目标,则应正确重定向用户

添加

<input type="hidden" name="target" value="/dashboard"/>
Run Code Online (Sandbox Code Playgroud)

重定向到特定页面的每个特定表单就足够了:)

编辑:我想我终于明白你到底想要什么。所以在这里我会做什么(基于这篇博文

class ApplicationController < ActionController::Base
  protect_from_forgery

  def after_sign_in_path_for(user)
    origin_path = session[:origin_path]
    clear_origin_path
    if origin_path.present?
      origin_path
    else
      params[:target].presence || default_redirect_path
    end
  end

  private

  def authenticate_user!
    store_origin_path
    super
  end

  def store_origin_path
    session[:origin_path] = request.fullpath
  end

  def clear_origin_path
    session[:origin_path] = nil
  end

end
Run Code Online (Sandbox Code Playgroud)

所以基本上,如果您尝试访问受保护的路径(比方说/protected_resource),该路径将存储在会话中,然后一旦用户登录,会话将被清除并正确重定向用户

然后,如果用户使用您的不同sign_in表单之一,并且该表单包含target输入,则用户将被重定向到该目标。

最后,如果用户使用没有任何目标的表单,他将被重定向到default_redirect_path您可能想要自定义的表单。

最后一件事:我认为比目标让我们假设某个用户的那张重定向到原来的请求是更重要的/protected_resource,因此被重定向到一个sign_in形式,尽管这sign_in形式所具有的target输入,用户将被重定向到/protected_resource一个后成功登录。

您可以通过反转after_sign_in_path_for方法中的条件轻松更改它

可能有更好的方法来做到这一点,但这对您来说是一个起点,您可能想要改进它;)

如果我的回答不够详细,请告诉我。