Heroku ActiveRecord错误:PgSQL在id字段中输入null

时间:2011-09-28 04:09:47

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord heroku

我刚刚向Heroku部署了一个简单的Ruby on Rails(3.0.10)应用程序。有一行代码就像这样创建一个新的User对象。

User.create(:name => "[name here]", :email => "[email here]")

它可以在我使用MySQL的本地机器上运行良好。在我将它部署到Heroku之后,我收到了一个错误。

ActiveRecord::StatementInvalid: PGError: ERROR:  null value in column "id" violates not-null constraint : INSERT INTO "users" ("id", "name", "email", "created_at", "updated_at") VALUES (NULL, '[name here]', '[email here]', '2011-09-28 03:59:12.908593', '2011-09-28 03:59:12.908593') RETURNING "id"

我不知道我的代码有什么问题。我错过了什么吗?

谢谢大家。

更新

移植

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :email
      t.string :name

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

模式

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

  create_table "users", :force => true do |t|
    t.string   "email"
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

4 个答案:

答案 0 :(得分:2)

你做到了这个: (摘自http://railsapps.github.com/rails-heroku-tutorial.html

  

将SQLite替换为PostgreSQL如果您使用本地开发   SQLite,你需要切换到PostgreSQL进行部署   Heroku的。如果您不想在本地使用PostgreSQL进行开发,那么   可以设置你的Gemfile以使用SQLite进行开发和PostgreSQL   用于生产。

     

要从SQLite切换到PostgreSQL以便部署到Heroku,请编辑   你的Gemfile并改变这一行:

gem 'sqlite3'
  

对此:

group :production do
  gem 'pg' 
end 
group :development, :test do
  gem 'sqlite3'
end

答案 1 :(得分:2)

对于其他任何人来说,我都有同样的问题。在开发中工作得很好,但在Postgres的制作失败了。我遇到的问题是我追溯到CanCan插件,特别是代码我创建了一个来宾用户的能力.rb文件,如果没有用户对象存在的话。在Railscast中建议了来宾帐户。我删除了User.new guest虚拟机创建命令并解决了问题。

答案 2 :(得分:1)

我只是重新创建整个RoR应用程序,并将我构建的所有控制器,模型和视图复制到新应用程序。它现在运行良好。

我试图比较2个版本,但没有任何结果。如果我找到原因,请让你们知道。

谢谢大家。 :)

答案 3 :(得分:1)

我有类似的问题。如果你试图重新加载模式(在本地,显然不做生产),你应该看到你认为你有什么和数据库实际想法的差异。

rake db:schema:dump
rake db:schema:load

这将删除您的数据。但是你应该看到“用户”的架构有所不同。这是我的不同之处:

新鲜转储显示:

create_table "posts", :id => :false, :force => true do |t|
    t.integer "id", :null  => false, :limit=> 8
    t.integer  "object_id",    :limit => 8
    t.string   "post_type"
    t.string   "from_id"
    t.text     "picture_url"
    t.text     "video_source"
    t.integer  "shares"
    t.integer  "likes"
    t.datetime "created_at",                :null => false
    t.datetime "updated_at",                :null => false
    t.integer  "image_size",   :limit => 8
    t.integer  "vid_size",     :limit => 8
end

但我知道id由rails处理,这应该是:

create_table "posts", :force => true do |t|
    t.integer  "object_id",    :limit => 8
    t.string   "post_type"
    t.string   "from_id"
    t.text     "picture_url"
    t.text     "video_source"
    t.integer  "shares"
    t.integer  "likes"
    t.datetime "created_at",                :null => false
    t.datetime "updated_at",                :null => false
    t.integer  "image_size",   :limit => 8
    t.integer  "vid_size",     :limit => 8
end

如果您也是这种情况,只需添加到您的用户模型:

set_primary_key :id

重置它,它现在有效。我仍然不知道问题的原因,但这对我来说是固定的。