【问题标题】:Rails3.1 upgrade causing NoMethodError on cookies.signedRails3.1 升级导致 cookies.signed 上的 NoMethodError
【发布时间】:2011-10-10 16:58:43
【问题描述】:

我在从 Rails 3.0.10 升级到 Rails 3.1 的应用程序中遇到了一些关于 cookie 存储的非常奇怪的问题。

我可以将失败的规范隔离为:

class TestController
  before_filter :check_cookie

  def index; end

  private

  def check_cookie
    if cookies.signed.present?
       cookies.delete(:test)
    end
  end
end

调用 check_cookie 过滤器的所有规范都失败,并显示如下错误消息:

NoMethodError:
  You have a nil object when you didn't expect it!
  You might have expected an instance of Array.
  The error occurred while evaluating nil.delete

# ./app/controllers/test_controller.rb:10:in `check_cookie'

为了进一步调试,我尝试在尝试调用 delete 之前添加一条语句以输出 cookies.signed

if cookies.signed.present?
    puts "Knock, knock? #{cookies.signed.respond_to?(:delete)}"
    ...

这输出“真”,但规范仍然失败。

使用 Rspec 2.6.0 运行 Rails 3.1.0。

任何想法如何解决这个问题?谢谢!

【问题讨论】:

    标签: ruby-on-rails cookies rspec ruby-on-rails-3.1


    【解决方案1】:

    在删除之前尝试检查 cookie 是否存在:

    if cookies.signed.present? && cookies.has_key?(:test)
       cookies.delete(:test)
    end
    

    【讨论】:

      【解决方案2】:

      您在 cookie 上调用 delete,但您正在检查 cookies.signed.respond_to 是否? :delete,也许你应该检查 cookies.respond_to? :删除?

      【讨论】:

        猜你喜欢
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        • 2014-05-21
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多