1

我正在按照 Sitepoint 的 Patrick Lenz 的书学习 ruby​​ on rails。我知道它有点过时了,所以我正在适应。

我已经到了一个地方,我在我的 rails 控制台中,准备开始创建/保存到我的数据库,当我创建一个类时,然后输入 story.save,我收到了这个错误:

1.9.3p194 :007 > story.save
   (0.1ms)  begin transaction
  SQL (0.5ms)  INSERT INTO "stories" ("link", "name") VALUES (?, ?)  [["link", nil], ["name", nil]]
SQLite3::ConstraintException: constraint failed: INSERT INTO "stories" ("link", "name") VALUES (?, ?)
   (0.1ms)  rollback transaction
ActiveRecord::StatementInvalid: SQLite3::ConstraintException: constraint failed: INSERT INTO "stories" ("link", "name") VALUES (?, ?)
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/sqlite3-1.3.6/lib/sqlite3/statement.rb:108:in `step'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/sqlite3-1.3.6/lib/sqlite3/statement.rb:108:in `block in each'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/sqlite3-1.3.6/lib/sqlite3/statement.rb:107:in `loop'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/sqlite3-1.3.6/lib/sqlite3/statement.rb:107:in `each'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/sqlite_adapter.rb:263:in `to_a'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/sqlite_adapter.rb:263:in `block in exec_query'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.3/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/sqlite_adapter.rb:242:in `exec_query'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:63:in `exec_insert'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:90:in `insert'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `insert'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/relation.rb:66:in `insert'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/persistence.rb:363:in `create'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/timestamp.rb:57:in `create'
... 14 levels...
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/validations.rb:50:in `save'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/attribute_methods/dirty.rb:22:in `save'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/transactions.rb:241:in `block (2 levels) in save'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/transactions.rb:208:in `transaction'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/transactions.rb:293:in `with_transaction_returning_status'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/transactions.rb:241:in `block in save'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/transactions.rb:252:in `rollback_active_record_state!'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.3/lib/active_record/transactions.rb:240:in `save'
    from (irb):7
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.3/lib/rails/commands/console.rb:47:in `start'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.3/lib/rails/commands/console.rb:8:in `start'
    from /Users/ideogram/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.3/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'1.9.3p194 :008 > 

我不知道这是什么意思。有任何想法吗?非常感谢您的帮助。:)

我在 Macbook Pro OSX Lion 10.7.3、Ruby 1.9.3-194、Rails 3.2.3 上运行。已经安装了 homebrew、rvm,然后是几个包,包括 readlines、sqlite3 和 git。

谢谢你!

附录:这是我的架构:

ActiveRecord::Schema.define(:version => 0) do

  create_table "stories", :force => true do |t|
    t.string "name"
    t.string "link"
  end

  add_index "stories", ["id"], :name => "sqlite_autoindex_stories_1", :unique => true

end

这是我用来创建表的 sqlite 命令:

CREATE TABLE `stories` (
  `id` int(11) NOT NULL,
  `name` varchar(255) default NULL,
  `link` varchar(255) default NULL,
  PRIMARY KEY (`id`)
);
4

4 回答 4

2

非常感谢大家帮助我。

在您的评论之间,我发现了问题所在。问题出在我的数据库中——它没有正确创建,所以一旦我删除了原始文件,然后再次重新编译文件(确保我所有的逗号都在正确的位置),它终于起作用了!

感谢您的所有帮助,所以再次感谢您。我从你的回答中学到了很多。:)

于 2012-05-10T07:40:59.417 回答
1

从您的架构的外观来看,您没有stories表。Patrick Lenz 教程使用 MySQL 作为数据库,但您使用的是 SQLite3。(我在看他的一篇旧文章。看来他在 2011 年更新了这篇文章)因为你有一个模式文件,我猜你正在使用迁移文件来生成你的数据库表。如果是这样,您的linkandname字段将默认为:null => true,因此对持有nil值没有疑虑。

rake db:migrate为您的表创建迁移文件后,您是否可能忘记了stories

于 2012-05-08T19:10:49.950 回答
1

Nil 值是问题——如果你需要允许 nil,你可以在迁移中改变它。

很多方法可以从控制台验证详细信息

> story.valid?
> story.errors (after a save)

等等等等

迁移(或您的 db/schema.rb)也会有所帮助

于 2012-05-08T18:44:07.500 回答
1

故事表不在您的迁移中。也许您是手动(sql)创建的,没有空约束。由于 Rails 对这些约束一无所知,因此它会从您的数据库中引发错误

于 2012-05-08T19:08:12.320 回答