数组中的“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
时,“堆栈太深”的问题也会消失