Rails3.1升级导致cookie.signed上的NoMethodError

时间:2011-10-10 08:47:09

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

关于我从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'

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

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

输出“true”,但规格仍然失败。

使用Rspec 2.6.0运行Rails 3.1.0。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您正在调用Cookie上的删除,但您是否正在考虑cookies.signed.respond_to? :删除,可能你应该检查cookies.respond_to? :删除