数组中的“each”/“map”会在create_time_zone_conversion_attribute中导致“你没有想到它时有一个nil对象”,偶尔会

我有一个按钮,它通过XHR向rails服务器中的特定操作发送get请求。 此操作调用我在模型“类别”中定义的函数。 这个函数做x = Category.subcategories之类的东西,下一行就像x.map(&:id)或x.each {| x | y << x.id}。 (类别has_many:子类别)。 在我的开发环境中,这个按钮只需1-10次点击,但由于以下原因停止工作:

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.include? 

使用以下转储:

 C:/MyApp/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:142:in `create_time_zone_conversion_attribute?' C:/MyApp/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:75:in `define_attribute_methods' C:/MyApp/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:71:in `each' C:/MyApp/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:71:in `define_attribute_methods' C:/MyApp/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:355:in `respond_to?' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:215:in `method_missing' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:215:in `map' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:215:in `send' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:215:in `method_missing' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:369:in `method_missing' C:/MyApp/app/models/category.rb:24:in `fetch_prices_grouped_by_date' C:/MyApp/app/controllers/categories_controller.rb:103:in `show' 

重新启动服务器可以解决下一次1-10次点击的问题,然后再次出现。 在调试该行时(在NetBeans IDE上,ruby-debug-ide-0.3.1),我得到(在超过1-10次“良好点击”之后)到method_missing(method =“map”,self =“{Array, 23个元素}“),如果我尝试在变量x上扩展监视,则调试服务器崩溃。 按照这篇文章的建议,我编辑了我的environment.rb并启用了类缓存:

 config.cache_classes = true 

问题解决了。 但是,每次更改代码后重启服务器都非常烦人,我想知道是否有人知道发生了什么,为什么更改cache_classes解决了它,以及是否有任何其他解决方法不能进行每次编辑后重新启动的痛苦。

我正在使用Rails 2.3.8。

非常感谢,阿米特

编辑:

好的,所以经过一些调试之后,我发现在create_time_zone_conversion_attribute中由于某种原因将skip_time_zone_conversion_for_attributes设置为nil失败了吗? 方法(active_record / attribute_methods.rb)。

经过一番研究后发现这篇文章 。 添加:

 self.skip_time_zone_conversion_for_attributes = [] 

到模型不起作用。

在environment.rb中替换

 config.time_zone = 'UTC' 

 config.active_record.default_timezone = :utc 

对我来说也不起作用,因为我得到“堆栈级太深”了:

 C:/MyApp/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:237:in `method_missing' C:/MyApp/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:253:in `method_missing' C:/MyApp/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:211:in `to_proc' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:369:in `method_missing' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:215:in `map' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:215:in `send' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:215:in `method_missing' C:/MyApp/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:369:in `method_missing' C:/MyApp/app/models/category.rb:24:in `fetch_prices_grouped_by_date' C:/MyApp/app/controllers/categories_controller.rb:103:in `show' 

我将进一步调查,看看它是否只是我的代码的一个特定问题。

编辑#2

好的,根据这篇文章的建议,我编辑了attributes_methods.rb第252行并将其更改为:

 if self.class.primary_key.to_s == method_name 

至:

 if false and self.class.primary_key.to_s == method_name 

现在它有效。 但是,不确定我喜欢搞乱框架的代码。 将不胜感激任何其他建议的解决方法。

谢谢! 阿米特

编辑#3

好的,最后一次更改打破了我的应用程序的其他部分。 我在这里转发了这个问题。

终于解决了! 在发布第三个问题并在trptcolin的帮助下,我可以确认一个有效的解决方案。

问题:我使用require来包含无表格模型中的模型(app / models中的类但不扩展ActiveRecord :: Base)。 例如,我有一个类FilterCategory执行FilterCategory require 'category' 。 这搞砸了Rails的类缓存。 我必须首先使用require ,因为像Category.find :all这样的行都失败了。

解决方案(信用转到trptcolin):用::Category.find :all替换::Category.find :all 。 这可以在不需要明确要求任何模型的情况下工作,因此不会导致任何类缓存问题。

使用config.active_record.default_timezone = :utc时,“堆栈太深”的问题也会消失