会话值在重定向rails 4后重置

时间:2013-10-09 12:47:52

标签: ruby-on-rails redirect cookies devise ruby-on-rails-4

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

1 个答案:

答案 0 :(得分:1)

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

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

config.assets.prefix = '/static_assets'

此外,您必须将资产管道文件夹重命名为static_assets

请注意,此解决方案仅适用于您的应用中有一个名为Asset的资源且rails版本为3.1 +

的情况