我刚刚开始使用最新版本的 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}" } * ', '
似乎我无法访问表的列,但我不知道为什么。我以相同的用户身份登录,在同一台机器上,使用相同的操作系统和内核。出于好奇,我创建了另一个应用程序,但它在重新启动后也不起作用。
我现在花了四个小时寻找答案,但我找不到任何相关的东西。什么可能导致此问题以及如何解决?