2

我剛剛爲Heroku部署了一個簡單的Ruby on Rails(3.0.10)應用程序。有一行代碼像這樣創建一個新的User對象。Heroku ActiveRecord錯誤:PgSQL在id字段中輸入null

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" 

我不知道我的代碼有什麼問題。我錯過了什麼嗎?

謝謝大家。

UPDATE

遷移

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 
+0

更新。謝謝。 :) –

+0

是。我知道,但我擔心沒有任何生產配置。它是如此奇怪....我有一個更深的檢查....將更新在這裏儘快...... –

回答

1

我只是重新創建整個RoR應用程序,並將所有控制器,模型和我建立新的應用程序的意見。它現在運行良好。

我試圖比較2個版本,沒有任何結果。如果我找出原因,請告訴你們。

謝謝大家。 :)

2

你做到這一點: (來自http://railsapps.github.com/rails-heroku-tutorial.html兩者)​​

Replace SQLite with PostgreSQL If you are developing locally using SQLite, you will need to switch to PostgreSQL for deployment to Heroku. If you don’t want to develop using PostgreSQL locally, you can set up your Gemfile to use SQLite for development and PostgreSQL for production.

To switch from SQLite to PostgreSQL for deployment to Heroku, edit your Gemfile and change this line:

gem 'sqlite3' 

To this:

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

感謝哥們。我的Gemfile與您的建議相同。問題仍然存在。 –

2

對於其他人看,我有這個相同的問題。在開發中工作良好,但在Postgres生產中失敗。我遇到的問題是追蹤到CanCan插件,特別是我創建的代碼,如果沒有用戶對象,則創建guest用戶的ability.rb文件。訪客帳戶是在Railscast中建議的。我刪除了User.new guest創建命令並解決了問題。

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是由軌道處理,這應該是:

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 

重置它,它現在可以工作。我仍然不知道問題的原因,但是這爲我解決了問題。

+0

謝謝@ amankapur91。你的意思是'set_primary_key:id'行需要永久保存在模型文件中嗎? –

+0

@ victorlamhk是的,我知道它不是理想的,但這是一個非常隨機的bug與英雄postrgress。如果你切換到aws,並且使用MYSQL,它就不會發生。 – amankapur91