Omniauth,mongoid,纯omniauth,身份验证尝试插入两次

时间:2014-01-24 04:49:40

标签: ruby-on-rails mongoid omniauth

所以我正在使用mongoid和纯omniauth构建一个webapp。我按照教程here进行了操作,但是我遇到了mongodb试图两次插入相同记录并抛出重复键错误的问题。有没有办法让我弄清楚第二个插件的来源?

以下是会话控制器的代码:

def create
    auth = request.env["omniauth.auth"]
    @user = User.where(:provider => auth['provider'], :uid => auth['uid']).first || User.create_with_omniauth(auth)
    session[:user_id] = @user.id
    redirect_to user_path(@user), :notice => "Signed in!"
end

这是create_with_omniauth

的用户模型中的代码
def self.create_with_omniauth(auth)
  create! do |user|
    user.provider = auth['provider']
    puts "finish provider"
    user.uid = auth['uid']
    puts "finish uid"
    if auth['info']
      user.name = auth['info']['name'] || ""
      puts "finish name"
      user.email = auth['info']['email'] || ""
      puts "finish email"
      user.oauth_token = auth.credentials.token
      puts "made oath token"
      user.save!
      puts "Saving the user"
    end
    puts "outside if"
  end
  puts "about to exit"
end

因此,在服务器日志中,我看到完成提供程序,完成uid,完成名称,完成电子邮件,制作誓言令牌,插入,然后保存用户,在外面是否,即将退出,然后是另一个插入。但是从会话控制器中的代码我的用户使用查询或创建。我不知道我会在哪里做另一个插入。

谢谢!

编辑:添加了代码

1 个答案:

答案 0 :(得分:1)

您通常调试内容的方法是逐步完成调用 - 您可以使用REPL,例如PRY。另一种选择就是进行二进制消除 - 在代码中的某个点开始并确保问题是在该点之前或之后,将该下一个断点移向该方向,然后重复此操作直到缩小原因。

总的来说,除非您提供的代码无效或只是提供更多信息,否则很难帮助您。现在你正在说"有什么不对,它是什么",没有其他人知道什么"什么"是或什么"错误"手段。你只是不能以这种方式得到任何有用的帮助。