2012-09-30 78 views
0

我在我的應用程序使用此邏輯的ID: 控制器導軌 - 如何立即得到插入

@current_user = User.find_or_create_from_oauth(auth_hash)

user.rb

def self.find_or_create_from_oauth(auth_hash) 
    provider = auth_hash["provider"] 
    uid = auth_hash["uid"].to_s 

    case provider  
     when 'twitter' 
     if user = self.find_by_twitter_uid(uid) 
      return user 
     else 
      return self.create_user_from_twitter(auth_hash) 
     end 

    end 
    end 

    def self.create_user_from_twitter(auth_hash) 
    a = self.create({ 
     :twitter_uid => auth_hash["uid"], 
     :name => auth_hash["info"]["name"] 
    }) 
    puts a.inspect 
    user = User.find_by_twitter_uid(a.twitter_uid) 
    puts '---' 
    puts user.inspect 
    end 

緊接在之後我需要跑這條線:

Assignment.create(:user_id => a.id, :role_id => 2) 

的問題是,該行puts user.inspect回報是這樣的:

#<User id: nil, name: "...name...", twitter_uid: "96580821", provider: "twitter", created_at: nil, updated_at: nil> 

爲什麼在哈希返回ID:無

或者,有沒有其他方法,如何獲取最後創建的記錄的ID?

+0

'放一個.inspect'應該已經給你新插入的用戶記錄的id。我不認爲你需要通過twitter_uid找到用戶;你可以直接使用'a'對象(因爲你似乎在'Assignment.create'行看起來是正確的,這行不行嗎? –

+1

記錄可能實際上並沒有被保存,請確保保存的記錄實際上是有效的 –

+1

Andrew Marshall可能是對的,如果創建不成功,我會將'a = self.create'更改爲'a = self.create!'以引發錯誤。 –

回答

0

如果用戶已經正確保存,你可以直接使用a

a.assignments.create(:role_id => 2) 

否則(使用create!,而不是create檢查)可能會有一個驗證錯誤。