我有一个我正在努力解决的Devise定制问题。
如果用户在点击链接时尚未经过身份验证,我们在某些电子邮件链接中包含了一个需要传递给登录URL的查询参数。例如,如果电子邮件链接是:
http://my.host.com/my/path/1234?x=y&foo=bar
我希望将未经身份验证的用户重定向到
http://my.host.com/login/?foo=bar
即,一个特定的查询参数需要传递 - 我不在乎登录表单上的任何其他人,但如果所有查询参数都必须通过,我可以忍受这一点。
我已经搜索了SO,以及文档& Devise和Warden的来源,但无法找到一种简单的方法。如果我错过了一些明显的东西,请道歉。
答案 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