【发布时间】:2012-10-01 04:39:26
【问题描述】:
我在我的应用程序中使用这个逻辑: 控制器
@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
在self.create 之后我需要立即运行这一行:
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>
为什么在hash中返回id:nil?
或者,有没有其他方法,如何获取上次创建记录的ID?
【问题讨论】:
-
上面的
puts a.inspect应该已经为您提供了新插入的用户记录的 id。我认为您不需要通过 twitter_uid 找到用户;您可以直接使用 'a' 对象(正如您在Assignment.create行中所做的那样确实是正确的。这条行不工作吗? -
记录可能实际上并未被保存。确保保存的记录确实有效。
-
安德鲁·马歇尔可能是对的。如果创建不成功,我会将
a = self.create更改为a = self.create!以引发错误。
标签: ruby-on-rails ruby activerecord model