【问题标题】:Rails - NoMethodError: undefined method `each' for nil:NilClass on Model.find_byRails - NoMethodError:未定义方法'each' for nil:Model.find_by上的NilClass
【发布时间】:2017-12-26 19:55:30
【问题描述】:

此错误仅发生在 rake 中,而不是在 rails 控制台中运行时发生。

这是崩溃的代码:

task upload_activities: :environment do
    include GoogleHelper
    file = 'upload/things_to_do_activities_upload_v1.csv'
    content = File.read(file)
    csv = CSV.parse(content, headers: true)
    puts 'Parsed CSV successfully'
    puts csv[0].to_hash # This works

    csv.each do |row|
      puts "1" # this is output
      guide = ThingsToDoGuide.find_by(city_id: 4321) # crashes here
      puts "2"
      ....

运行 rake 时,控制台会输出所有内容,直到行 ThingsToDoGuide.find_by(city_id: 4321)

我可以在 Rails 控制台中运行完全相同的行,并且运行良好。

错误文本是:

rails aborted!
NoMethodError: undefined method `each' for nil:NilClass
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/httparty-0.15.5/lib/httparty/module_inheritable_attributes.rb:38:in `inherited'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activerecord-5.0.4/lib/active_record/associations/collection_proxy.rb:30:in `<module:Associations>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activerecord-5.0.4/lib/active_record/associations/collection_proxy.rb:2:in `<module:ActiveRecord>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activerecord-5.0.4/lib/active_record/associations/collection_proxy.rb:1:in `<top (required)>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `require'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `block in require'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:257:in `block in load_dependency'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:662:in `new_constants_in'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:257:in `load_dependency'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `require'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/will_paginate-3.1.6/lib/will_paginate/active_record.rb:244:in `<module:ActiveRecord>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/will_paginate-3.1.6/lib/will_paginate/active_record.rb:18:in `<module:WillPaginate>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/will_paginate-3.1.6/lib/will_paginate/active_record.rb:6:in `<top (required)>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `require'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `block in require'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:257:in `block in load_dependency'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:662:in `new_constants_in'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:257:in `load_dependency'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `require'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/will_paginate-3.1.6/lib/will_paginate/railtie.rb:10:in `block (2 levels) in <class:Railtie>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/lazy_load_hooks.rb:43:in `instance_eval'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/lazy_load_hooks.rb:43:in `execute_hook'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/lazy_load_hooks.rb:50:in `block in run_load_hooks'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/lazy_load_hooks.rb:49:in `each'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/lazy_load_hooks.rb:49:in `run_load_hooks'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activerecord-5.0.4/lib/active_record/base.rb:324:in `<module:ActiveRecord>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activerecord-5.0.4/lib/active_record/base.rb:24:in `<top (required)>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `require'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `block in require'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:257:in `block in load_dependency'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:662:in `new_constants_in'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:257:in `load_dependency'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:293:in `require'
/Users/Calvino/dev/triphappy/app/models/application_record.rb:3:in `<top (required)>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:477:in `load'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:477:in `block in load_file'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:662:in `new_constants_in'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:476:in `load_file'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:375:in `block in require_or_load'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:37:in `block in load_interlock'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies/interlock.rb:12:in `block in loading'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/concurrency/share_lock.rb:150:in `exclusive'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies/interlock.rb:11:in `loading'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:37:in `load_interlock'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:358:in `require_or_load'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:511:in `load_missing_constant'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:203:in `const_missing'
/Users/Calvino/dev/triphappy/app/models/things_to_do_guide.rb:1:in `<top (required)>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:477:in `load'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:477:in `block in load_file'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:662:in `new_constants_in'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:476:in `load_file'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:375:in `block in require_or_load'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:37:in `block in load_interlock'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies/interlock.rb:12:in `block in loading'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/concurrency/share_lock.rb:150:in `exclusive'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies/interlock.rb:11:in `loading'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:37:in `load_interlock'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:358:in `require_or_load'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:511:in `load_missing_constant'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/activesupport-5.0.4/lib/active_support/dependencies.rb:203:in `const_missing'
/Users/Calvino/dev/triphappy/lib/tasks/things_to_do.rake:81:in `block (3 levels) in <top (required)>'
/Users/Calvino/dev/triphappy/lib/tasks/things_to_do.rake:76:in `block (2 levels) in <top (required)>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/railties-5.0.4/lib/rails/commands/rake_proxy.rb:14:in `block in run_rake_task'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/railties-5.0.4/lib/rails/commands/rake_proxy.rb:11:in `run_rake_task'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/railties-5.0.4/lib/rails/commands/commands_tasks.rb:51:in `run_command!'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/railties-5.0.4/lib/rails/commands.rb:18:in `<top (required)>'
/Users/Calvino/dev/triphappy/bin/rails:9:in `require'
/Users/Calvino/dev/triphappy/bin/rails:9:in `<top (required)>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `load'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `call'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/spring-2.0.2/lib/spring/client/command.rb:7:in `call'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/spring-2.0.2/lib/spring/client.rb:30:in `run'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/spring-2.0.2/bin/spring:49:in `<top (required)>'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `load'
/Users/Calvino/.rvm/gems/ruby-2.4.1/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `<top (required)>'
/Users/Calvino/dev/triphappy/bin/spring:15:in `require'
/Users/Calvino/dev/triphappy/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => things_to_do:upload_activities
(See full trace by running task with --trace)

我认为模型有问题,但它完全是空白的。

class ThingsToDoGuide < ApplicationRecord

end

有什么想法吗?

【问题讨论】:

  • 是的 - 它正确返回控制台中的对象。

标签: ruby-on-rails ruby activerecord rake


【解决方案1】:

这看起来像是 HTTParty gem 的问题,而不是 Rails 的问题。如果您按照堆栈跟踪的建议转到httparty/lib/module_inheritable_attributes.rb 第38 行的inherited 方法,您将看到在实例变量上调用each 方法。由于某种原因,该实例变量在该上下文中必须是 nil。您可以考虑在 repo 中打开一个问题。

https://github.com/jnunemaker/httparty/blob/master/lib/httparty/module_inheritable_attributes.rb#L38

【讨论】:

  • 有趣 - 知道为什么在我的 find_each 方法调用期间会调用它吗?这绝对是问题所在,我在 GoogleHelper 模块中使用 HTTParty 并注释掉该行解决了问题。
  • 如果没有看到您的 GoogleHelper 模块的内容就不确定
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 2017-09-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多