1

我正在使用设计 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。

4

1 回答 1

1

我在这里添加解决方案,以防其他人遇到同样的问题。

我的应用程序中有一个名为资产的资源,它与资产管道冲突。每当我的 URL 包含“资产”(例如“/资产”)时,会话就会被重置。因此,如果您有一个名为资产的资源,那么您必须更改资产管道的前缀。为此,请在application.rb文件中添加以下行。

config.assets.prefix = '/static_assets'

您还必须将资产管道文件夹重命名为static_assets.

请注意,此解决方案仅适用Asset于您的应用程序中已命名资源且 Rails 版本为 3.1+ 的情况

于 2013-10-10T11:58:02.747 回答