【问题标题】:TypeError: Books is not a classTypeError:书籍不是一个类
【发布时间】:2015-04-30 15:08:19
【问题描述】:

这是我第一次尝试在 Rails 项目上制作 ruby​​,但我在 migrate 命令方面遇到了困难。

我遵循了本教程tutorial。 当我尝试使用迁移时:rake db:migrate 我收到此错误:

rake aborted!
TypeError: Books is not a class
/home/dudi/tutorials/books/db/migrate/20150227191301_books.rb:1:in `<top (required)>'
TypeError: Books is not a class
/home/dudi/tutorials/books/db/migrate/20150227191301_books.rb:1:in `<top (required)>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

但是文件说 Books 是一个类:

class Books < ActiveRecord::Migration
  def self.up
     create_table :books do |t|
    t.column :title, :string, :limit => 32, :null => false
    t.column :price, :float
    t.column :subject_id, :integer
    t.column :description, :text
    t.column :created_at, :timestamp
     end
  end

  def self.down
    drop_table :books
  end
end

我在这里做错了什么?


编辑:

我尝试将class Book 更改为class create_Book,并将文件名更改为create_Book。当我输入rake db:migrate 时,什么也没发生(我猜它起作用了?),在网页上我收到了这条消息:

Couldn't find Book with 'id'=all

存档book_controller

class BookController < ApplicationController

 #printout of all the books in the database
 def list
   @books = Book.find(:all) 
 end
end

我也尝试将Book.find 更改为create_Book.find 我得到了这个错误:

undefined local variable or method `create_Book'

【问题讨论】:

  • 迁移的名称与模型的名称相同 - 可能会引起一些混淆 - 尝试class CreateBooks &lt; ActiveRecord::Migration
  • 不要忘记将文件重命名为create_books.rb。另外,请记住,这可以使用生成器为您完成。更多信息在这里:edgeguides.rubyonrails.org/…

标签: ruby-on-rails ruby database-migration


【解决方案1】:

首先,您希望 Books 能够将数据存储在数据库中吗?因为您在该迁移中有一个 drop_table 行。这意味着您将创建表,然后将其删除。

其次,rake db:migrate 是最后一步。您在本教程中是否使用了命令“rails generate model”?或者您是否尝试先运行迁移? (注意 rails generate model 也会自动为你生成迁移文件)

您需要先创建一个名为 Books 的模型,然后才能运行迁移。您收到的错误是在您的模型中查找 Books 类,但找不到。

如果您的模型中已经有 Books 类,请编辑它以包含该文件。如果我们可以看到您的实际模型,而不仅仅是迁移,这将为我们提供有关为什么 rails 认为那里没有 Books 模型的信息。

您的 Books 模型应该继承自 ActiveRecord::Base 或继承自另一个继承自 ActiveRecord::Base 的类。是这样吗?

【讨论】:

  • 嗨,我有一个带有 Book.rb 文件的模型文件夹(如教程所述): class Book "错误信息”结束
  • 是的,上面其他人都说了,你只需要将类重命名为 CreateBooks
  • 我只需要在迁移上更改名称吗?还是在控制器和模型上..?
  • 不。您将希望您的模型继承自 ActiveRecord::Base,并且控制器只处理前端工作,它与数据库迁移完全无关。将类名更改为 CreateBooks
  • 您现在在编辑中遇到的错误与您的控制器有关,与 rake db:migrate 无关。你知道怎么查吗?查看 schema.rb。如果你在那里看到你的列,你就会知道数据库设置正确并且错误来自其他地方。
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 2017-04-17
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多