我正在使用设计 3.5.1、rails 4.0.0 和 ruby 2.0.0-p0。
如果用户没有登录并试图打开一个需要身份验证的私人页面,比如说lvh.me:3000/users/1/edit
,那么 devise 将添加users/1/edit
会话中的密钥user_return_to
。问题是,当用户在身份验证失败后被重定向到登录页面user_return_to
时,会话中的值会被重置。
我的整个应用程序都有这个问题。如果我在会话中存储一个值并从同一操作重定向到另一个路径,那么会话值就会消失。
注意:我已将我的 rails 应用程序从 (rails 3.0.4, ruby 1.8.7) 升级到 (rails 4.0.0, ruby 2.0.0)。
抱歉问题中的任何歧义。如果您有任何问题,请发表评论。
更新:
在我的应用程序控制器中,我添加了一个前置过滤器来验证用户身份。应用程序控制器中仅显示相关代码。
application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :authenticate_user!, :unless => :devise_controller?
# rest of the code
end
我正在使用继承的自定义失败类Devise::FailureApp
。代码看起来像这样。
custom_failure.rb
class CustomFailure < Devise::FailureApp
def redirect_url
eval "new_user_session_path"
end
def redirect
store_location!
flash[:alert] = i18n_message
# session[:user_return_to] returns '/foobar' here.
redirect_to redirect_url
end
end
我在上面的代码中注释了一行。session[:user_return_to] 在该行可用,但在下一行重定向之后, session[:user_return_to] 变为 nil。
我已将设计从 1.5.3 升级到 3.5.1。