【发布时间】:2013-10-09 12:47:51
【问题描述】:
我正在使用 devise 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。
【问题讨论】:
-
您能否添加一些您用于身份验证和重定向的代码。我也希望你已经升级了设计。
-
@Srikanth,你是对的。我也升级了设计。我已经用相关代码更新了我的答案。
标签: ruby-on-rails redirect cookies devise ruby-on-rails-4