3

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

<input type="hidden" name="target" value="/dashboard"/>

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

4

1 回答 1

5

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

class ApplicationController < ActionController::Base

  def after_sign_in_path_for
    params[:target] || some_default_url
  end

end

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

添加

<input type="hidden" name="target" value="/dashboard"/>

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

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

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

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

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

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

最后一件事:我假设重定向到原始请求比目标更重要,所以假设用户继续/protected_resource并因此被重定向到 sign_in 表单,即使此 sign_in 表单有target输入,用户也会被重定向/protected_resource到成功登录。

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

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

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

于 2012-10-29T20:42:48.980 回答