【问题标题】:undefined method `eq' for nil:NilClass with rails 3 and ruby enterprise on ubuntu hardy用于 nil:NilClass 的未定义方法 `eq' 在 ubuntu hardy 上使用 rails 3 和 ruby​​ enterprise
【发布时间】:2010-06-26 14:55:20
【问题描述】:

我不确定是什么导致了这个错误,但是因为我在乘客中遇到了这个问题,现在在控制台中也遇到了这个问题,我想也许 mysql 驱动程序是问题所在? 在 osx/10.6 上一切正常。它不会在 Ubuntu 8.04 hardy 上运行。

我将问题归结为“销毁”方法或直接调用 activerecord 实例的方法时。为什么会这样?有什么想法吗?

系统:

  • Ubuntu 8.04 耐寒。
  • ruby 1.8.7 (2010-04-19 patchlevel 253) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2010.02
  • rails 3.0.0-beta4
  • mysql Ver 14.12 Distrib 5.0.51a,适用于使用 readline 5.2 的 debian-linux-gnu (i486)

这是错误输出

root@gehege:/var/www/foobar.com/api.foobar.com/v1# rake cleanup:status_cleanup RAILS_ENV=production --trace
(in /var/www/foobar.com/api.foobar.com/v1)
** Invoke cleanup:status_cleanup (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute cleanup:status_cleanup
rake aborted!
undefined method `eq' for nil:NilClass
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/persistence.rb:76:in `destroy'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/locking/optimistic.rb:110:in `destroy'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/callbacks.rb:278:in `destroy'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activesupport-3.0.0.beta4/lib/active_support/callbacks.rb:412:in `_run_destroy_callbacks'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/callbacks.rb:278:in `destroy'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/transactions.rb:230:in `destroy'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/transactions.rb:287:in `with_transaction_returning_status'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/transactions.rb:202:in `transaction'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/transactions.rb:285:in `with_transaction_returning_status'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/activerecord-3.0.0.beta4/lib/active_record/transactions.rb:230:in `destroy'
/var/www/foobar.com/api.foobar.com/v1/lib/tasks/cleanup.rake:8
/var/www/foobar.com/api.foobar.com/v1/lib/tasks/cleanup.rake:6:in `each'
/var/www/foobar.com/api.foobar.com/v1/lib/tasks/cleanup.rake:6
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run'
/opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/rake-0.8.7/bin/rake:31
/opt/ree/bin/rake:19:in `load'
/opt/ree/bin/rake:19

编辑:

即使在运行 apt-get update/upgrade 到最新的 hardy 包并重新编译 ree 和 mysql gem 之后,我也会遇到同样的错误。

【问题讨论】:

  • 您在 OSX 计算机上使用的 Rails 版本是什么?这可能是您在 Ubuntu 上拥有的 beta 版本的问题。此外,您的数据库可能有问题 - 请查看第 77 行的github.com/rails/rails/blob/master/activerecord/lib/…
  • jamie:rake 任务代码在这里:pastie.org/1019994。但这很简单,我不认为这是问题所在。
  • adrian:我在我的 osx 机器上尝试了 beta3。你指的是什么数据库问题?
  • aha - adrian:我尝试了“delete”而不是“destroy”,但我得到了错误:表webcal_entry_user 没有名为id 的属性——因为我正在包装activerecord/rails一个现有的 mysql 数据库(这个表没有 id 字段)也许这是问题所在?

标签: mysql ruby ruby-on-rails-3


【解决方案1】:

回答我自己的问题:经过一些研究,我发现 rails (activerecord) 需要映射到模型的表上的 id 字段。如果您使用链接表,则不需要它们 - 但对于您想作为模型处理的表,它们是。在我的情况下,解决方案是添加

set_primary_key :cal_id

其中 cal_id 是我的唯一键。

【讨论】:

  • 当表名不符合 Rails 命名约定时,也会发生此错误。在这种情况下,使用set_table_name :your_table_name_here
【解决方案2】:

从没有 id 字段的表中删除时,我遇到了同样的错误。我认为这是 Rails 3 beta 4 的错误。

【讨论】:

  • 确实,rails 需要 id 字段。这不是 rails 3 beta4 错误,因为它也存在于 rails 2.2 和 2.3。
【解决方案3】:

我在将没有 id 的 HABTM 表转换为 has_many 的连接模型后发现了这个问题:通过。我忘了添加 :id 列...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2013-02-17
    • 2014-03-16
    • 2012-10-08
    相关资源
    最近更新 更多