Rspec 模型中带有“;方法缺失";在Rails 4中的行为与Rails 3中的行为不同(可能导致堆栈级别太深';错误)
我有一个Rails应用程序,它与Rails 3.2.14配合得很好。我刚刚开始将它升级到Rails 4,基本上是跟随它 我尝试运行rspec测试,发现许多测试失败,出现以下错误:Rspec 模型中带有“;方法缺失";在Rails 4中的行为与Rails 3中的行为不同(可能导致堆栈级别太深';错误),rspec,upgrade,ruby-on-rails-4,Rspec,Upgrade,Ruby On Rails 4,我有一个Rails应用程序,它与Rails 3.2.14配合得很好。我刚刚开始将它升级到Rails 4,基本上是跟随它 我尝试运行rspec测试,发现许多测试失败,出现以下错误: Failure/Error: Unable to find matching line from backtrace SystemStackError: stack level too deep 我还检查了我的黄瓜测试,发现类似的失败 stack level too deep (SystemStackErr
Failure/Error: Unable to find matching line from backtrace
SystemStackError:
stack level too deep
我还检查了我的黄瓜测试,发现类似的失败
stack level too deep (SystemStackError)
因为在我开始升级之前一切都很好,所以我一直在寻找其他类似的体验,但没有找到
我试过Ruby 1.9和2.0。我没有修改任何代码
感谢您的指导
更新:
我已经追踪到了一个模型,该模型定义了方法\u missing
,作为其实现的一部分。我已经描述了我在a中发现的内容,以便可以单独对其进行评论
我的应用程序包含一个模型,它实现了自己的
方法\u missing
,这可能会导致递归循环,最后以“stack level to deep”错误结束。根据建议,有足够的细节来保证将其作为答案分开
我已经追踪到了一个模型,该模型定义了方法\u missing
,作为其实现的一部分。我发现,如果模型中缺少方法定义
,那么它被称为,而不是任何访问器。这会导致任何模型设置失败
(在我的具体案例中,定义了方法_missing,这就是我最初提到的堆栈溢出的原因)
通过在rails 3.2.14中定义一个新的rails应用程序,然后创建一个新模型,我可以简洁地重现这个问题:
class Item < ActiveRecord::Base
attr_accessible :name, :content
store :content
def method_missing(id, *args)
puts "method missing: #{id}"
end
end
我觉得需要这样做是不对的,因为不清楚为什么Rails3和Rails4之间会改变这种行为。我觉得我遗漏了一些其他的东西…根据建议,有足够的细节来保证将此作为答案分开 我已经追踪到了一个模型,该模型定义了
方法\u missing
,作为其实现的一部分。我发现,如果模型中缺少方法定义
,那么它被称为,而不是任何访问器。这会导致任何模型设置失败
(在我的具体案例中,定义了方法_missing,这就是我最初提到的堆栈溢出的原因)
通过在rails 3.2.14中定义一个新的rails应用程序,然后创建一个新模型,我可以简洁地重现这个问题:
class Item < ActiveRecord::Base
attr_accessible :name, :content
store :content
def method_missing(id, *args)
puts "method missing: #{id}"
end
end
我觉得需要这样做是不对的,因为不清楚为什么Rails3和Rails4之间会改变这种行为。我觉得我遗漏了一些其他的东西…我也不知道更改是什么,但是您可以通过检查
对没有属性的\u进行响应来避免为非访问器方法调用super?
。这是在
我也不知道发生了什么变化,但是您可以通过选中
respond\u to\u而不选择\u属性来避免对非访问器方法调用super。这是在
这本身不是一个答案,但请参阅了解如何处理。问题也发生在rake db:seed
上。我相信这是由于我的应用程序递归地包含模型子目录(config.autoload_path+=Dir[Rails.root.join('app'、'models'、'content_items'))]
)。我已经在一个新的测试应用程序中复制了这种行为,现在正在调查……请查看我对原始问题的更新。堆栈溢出仅仅是定义方法方法\u缺失的模型的症状。当模型中定义了method\u missing
时,Rails 4中有一个明确的行为差异。干得好!我只是搜索了一下,虽然我发现了一个明显相关的,但我没有在任何发行说明中看到这一点。你可能想在一个单独的答案中考虑我们对你的解释,这样人们就可以清楚地看到它(并对它进行投票!)。除非你认为递归完全是你的情况所独有的,否则你甚至可能想恢复标题,以帮助其他有这种症状的人找到它。答案本身不是,但是请参阅了解如何处理。问题也发生在rakedb:seed
上。我相信这是由于我的应用程序递归地包含模型子目录(config.autoload_path+=Dir[Rails.root.join('app'、'models'、'content_items'))]
)。我已经在一个新的测试应用程序中复制了这种行为,现在正在调查……请查看我对原始问题的更新。堆栈溢出仅仅是定义方法方法\u缺失的模型的症状。当模型中定义了method\u missing
时,Rails 4中有一个明确的行为差异。干得好!我只是搜索了一下,虽然我发现了一个明显相关的,但我没有在任何发行说明中看到这一点。你可能想在一个单独的答案中考虑我们对你的解释,这样人们就可以清楚地看到它(并对它进行投票!)。除非你认为递归完全是你的情况所独有的,否则你甚至可能想恢复标题,以帮助其他有这种症状的人找到它。
$ rails console
Loading development environment (Rails 3.2.14)
2.0.0p247 :001 > x = Item.new(name: 'foo')
=> #<Item id: nil, name: "foo", content: {}, created_at: nil, updated_at: nil>
2.0.0p247 :002 >
$ rails console
Loading development environment (Rails 4.0.0)
2.0.0p247 :001 > x = Item.new(name: 'foo')
method missing: name=
=> #<Item id: nil, name: nil, content: {}, created_at: nil, updated_at: nil>
2.0.0p247 :002 >
def method_missing(id, *args)
super
if respond_to? id
send(id,*args)
else
puts "method missing: #{id}"
end
end
def method_missing(method, *args)
super if respond_to_without_attributes?(method, true) # returns true when attr accessors
if respond_to? method
send(method,*args)
else
puts "method missing: #{method}"
end
end