4

我刚刚开始使用最新版本的 Rails 和 PostgreSQL 编写应用程序。我创建了数据库,添加了所需的 gem,配置了 database.yml 文件并从两个模型开始 - 用户(这个使用 Devise 进行身份验证)和组。我为起始页创建了一个额外的控制器(简单的一个 - 仅用于显示链接列表)。一切似乎都很好,我能够将测试数据添加到数据库中——直到今天早上我回来并想继续工作。

只要我停留在主页上,一切都像昨天一样。但是当我尝试访问组列表时,出现以下错误:

Routing Error

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.map

页面上没有其他信息,所以我查看了 Webrick 控制台并看到以下内容:

ActionController::RoutingError (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.map):
app/controllers/groups_controller.rb:1:in `<top (required)>'

像往常一样,我的控制器的第一行是:

class GroupsController < ApplicationController

我查看了其他操作,结果是一样的:意外的 nil 对象。尝试对用户执行任何操作时发生同样的问题。

我怀疑这是一个数据库问题(因为它根本不影响没有使用数据库的控制器),所以我去 rails 控制台看看我是否可以手动添加条目。我不能。

ruby-1.9.2-p180 > group = Group.new
(some SQL)
NoMethodError: 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.map
  from /home/lite/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.1.0.rc4/lib/active_record/persistence.rb:320:in `attributes_from_column_definition'
  from /home/lite/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.1.0.rc4/lib/active_record/locking/optimistic.rb:69:in `attributes_from_column_definition'
  from /home/lite/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.1.0.rc4/lib/active_record/base.rb:1525:in `initialize'
  from (irb):1:in `new'
  from (irb):1
  from /home/lite/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.0.rc4/lib/rails/commands/console.rb:45:in `start'
  from /home/lite/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.0.rc4/lib/rails/commands/console.rb:8:in `start'
  from /home/lite/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.1.0.rc4/lib/rails/commands.rb:40:in `<top (required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'

我查看了最顶层的文件(persistence.rb)并搜索了第 320 行。

319: def attributes_from_column_definition
320:  Hash[self.class.columns.map do |column|
321:    [column.name, column.default]
322:  end]
323: end

这个定义让我对可能发生的事情有了一点了解,所以我在控制台(Group.inspect)中又运行了一个命令,但在以下行出现错误:

attr_list = columns.map { |c| "#{c.name}: #{c.type}" } * ', '

似乎我无法访问表的列,但我不知道为什么。我以相同的用户身份登录,在同一台机器上,使用相同的操作系统和内核。出于好奇,我创建了另一个应用程序,但它在重新启动后也不起作用。

我现在花了四个小时寻找答案,但我找不到任何相关的东西。什么可能导致此问题以及如何解决?

4

2 回答 2

1

我找到了一个有罪的人:我用来自动检测外键的名为“automatic_foreign_key”的小宝石。当我回滚所做的更改、删除它并手动更改表时,我的应用程序再次运行。

谢谢大家的帮助!

于 2011-07-15T07:38:33.213 回答
0

也许Group是这个版本的 postgresql 或 rails 中的保留字。rails-3.1.0-rc4 是最新的 rails 版本。生成另一个死简单模型来检查它。

于 2011-07-14T15:01:13.503 回答