我刚刚开始使用最新版本的Rails和PostgreSQL编写应用程序。我创建了数据库,添加了所需的gem,配置了database.yml文件并启动了两个模型 - 用户(这个用于认证的Devise)和Group。我为起始页面创建了一个额外的控制器(简单的一个 - 仅显示链接列表)。一切似乎都很好,我能够将测试数据添加到数据库中 - 直到我今天早上回来并想继续工作。
只要我留在主页上,一切看起来就像昨天一样。但是当我尝试访问组列表时,我收到以下错误:
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
我查看了其他动作,结果是一样的:意外的零对象。尝试对User执行任何操作时发生同样的问题。
我怀疑这是一个数据库问题(因为它根本没有影响完全没有使用数据库的控制器),所以我去了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}" } * ', '
好像我无法访问桌子的列,但我不明白为什么。我使用相同的操作系统和内核在同一台计算机上以同一用户身份登录。出于好奇,我创建了另一个应用程序,它在重启后也没有用。
我现在花了四个小时寻找答案,但我找不到任何相关内容。可能导致此问题的原因以及如何解决此问题?
答案 0 :(得分:1)
我找到了有罪的一个:名为'automatic_foreign_key'的小宝石,我曾经自动检测外键。当我回滚它所做的更改,删除它并手动更改表时,我的应用程序再次运行。
谢谢大家的帮助!
答案 1 :(得分:0)
也许 Group 是这个版本的postgresql或rails中的保留字。 rails-3.1.0-rc4是最新版的rails。生成另一个 dead简单的模型来检查它。