如何将查询参数传递给Devise的登录页面

时间:2014-03-19 14:42:27

标签: ruby-on-rails devise

我有一个我正在努力解决的Devise定制问题。

如果用户在点击链接时尚未经过身份验证,我们在某些电子邮件链接中包含了一个需要传递给登录URL的查询参数。例如,如果电子邮件链接是:

http://my.host.com/my/path/1234?x=y&foo=bar

我希望将未经身份验证的用户重定向到

http://my.host.com/login/?foo=bar

即,一个特定的查询参数需要传递 - 我不在乎登录表单上的任何其他人,但如果所有查询参数都必须通过,我可以忍受这一点。

我已经搜索了SO,以及文档& Devise和Warden的来源,但无法找到一种简单的方法。如果我错过了一些明显的东西,请道歉。

3 个答案:

答案 0 :(得分:4)

最后,我们通过一条非常不同的路线获得了我们想要的效果。

我们能够修改相关代码以接受会话参数,而不是将param包含在重定向到登录的查询URL中。

然后,在application_controller.rb

class ApplicationController < ActionController::Base
  before_filter :persist_login_param
  ...

  def persist_login_param
    session[:foo] = params[:foo]
  end
end

在会话控制器中,我们对会话参数的值进行操作,一旦完成就将其丢弃。

稍微凌乱,但是它可以工作并且现在将代码推送到生产中,这是重要的事情!

答案 1 :(得分:0)

对于未经身份验证的用户,为了将foo=bar中的特定参数http://my.host.com/my/path/1234?x=y&foo=bar传递到您的登录信息,请执行以下操作:

假设上述电子邮件链接转到操作myaction,请将以下代码添加到myaction

  def myaction
    if member_signed_in?
      redirect_to root_path
    else
      ## If user is unauthenticated direct them to login page with specific params
      redirect_to new_member_session_path(foo: params[:foo]) 
    end
  end

以上操作会将params foo传递到设计登录页面,浏览器地址栏中的实际链接如下所示:

http://my.host.com/login?foo=bar  ## Without / after login

您可以通过覆盖Devise :: SessionsController来访问该参数。例如:

class Users::SessionsController < Devise::SessionsController
  ...
  def new
    @foo = params[:foo]
    super
  end
  ...
end

答案 2 :(得分:0)

可以在before_action中使用unless语句,然后unauthentication用户可以看到任何设计控制器操作

class ApplicationController < ActionController::Base
  ...
  before_filter :sending_params
  before_action :check_auth, unless: :devise_controller?

  ...

  protected

  def check_auth
    unless user_signed_in?
      redirect_to new_user_session_path(sending_params)
    end
  end

  def sending_params
    params.permit(:first_param, :second_param)
  end
  ...

并且可以通过生成设计视图并在视图中使用来访问没有生成设计控制器的参数

<%= params[:first_param] %>

如果需要将参数发送到omniauth控制器,您可以在设计视图中更改链接

<%= link_to 'Sign in by provider', omniauth_authorize_path(:user, :provider, first_param: params['first_param']) %>

其中:user-name devise model,:provider - name omniauth provider(:facebook ie。)

在omniauth控制器中,您可以使用

 def first_param
   request.env['omniauth.params']['first_param'] ||= ''
 end