Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rspec 模型中带有“;方法缺失";在Rails 4中的行为与Rails 3中的行为不同(可能导致堆栈级别太深';错误)_Rspec_Upgrade_Ruby On Rails 4 - Fatal编程技术网

Rspec 模型中带有“;方法缺失";在Rails 4中的行为与Rails 3中的行为不同(可能导致堆栈级别太深';错误)

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

我有一个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 (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