我正在使用设计3.5.1,rails 4.0.0和ruby 2.0.0-p0。
如果用户未登录并尝试打开需要身份验证的私人网页,请说lvh.me:3000/users/1/edit
,然后设计会在密钥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)。
很抱歉问题含糊不清。如果您有任何疑问,请发表评论。
更新
在我的应用程序控制器中,我添加了一个before过滤器来验证用户身份。应用程序控制器中仅显示相关代码。
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
我在上面的代码中注释了一行。会话[:user_return_to]在该行可用,但在下一行重定向后,会话[:user_return_to]变为零。
我已将设计从1.5.3升级到3.5.1。
答案 0 :(得分:1)
我在这里添加解决方案,以防其他人遇到同样的问题。
我的应用程序中有一个名为asset的资源,它与资产管道冲突。每当我的网址包含“资产”时,会话就会重置,例如'/资产'。因此,如果您有一个名为asset的资源,那么您必须更改资产管道的前缀。为此,请在 application.rb 文件中添加以下行。
config.assets.prefix = '/static_assets'
此外,您必须将资产管道文件夹重命名为static_assets
。
请注意,此解决方案仅适用于您的应用中有一个名为Asset
的资源且rails版本为3.1 +