2012-09-30 47 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检查)可能会有一个验证错误。