SQLite3::Error de excepción de ocupación
Frecuentes
Visto 1,351 equipos
1
Recibo este error cuando se crea una nueva cuenta de usuario:
ActiveRecord::StatementInvalid in SessionsController#create
SQLite3::SQLException: cannot start a transaction within a transaction: begin transaction
Estoy usando koala y omniauth gem para autenticar y obtener amigos de los usuarios. ¿Por qué no puedo iniciar dos transacciones, por qué revierte la migración de amigos?
¿Cómo se arregla esto?
Este es mi controlador de sesión:
class SessionsController < ApplicationController
def create
user = User.from_omniauth(env['omniauth.auth'])
session[:user_id] = user.id
redirect_to root_url, notice: "Signed in!"
end
Este es mi modelo de usuario:
class User < ActiveRecord::Base
has_many :friends
def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["info"]["name"] unless auth["info"].blank?
user.first_name = auth["info"]["first_name"] unless auth["info"].blank?
user.last_name = auth["info"]["last_name"] unless auth["info"].blank?
user.image = auth["info"]["image"] unless auth["info"].blank?
user.email = auth["info"]["email"] unless auth["info"].blank?
user.gender = auth["extra"]["raw_info"]["gender"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank?)
user.location = auth["extra"]["raw_info"]["location"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"].blank? && !auth["extra"]["raw_info"]["location"].blank?)
user.token = auth["credentials"]["token"] unless auth["credentials"].blank?
# highschool data
user.highschool_name = auth["extra"]["raw_info"]["education"][0]["school"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][0]["school"].blank?)
user.highschool_year = auth["extra"]["raw_info"]["education"][0]["year"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][0]["year"].blank?)
# graduate school data
user.graduateschool_name = auth["extra"]["raw_info"]["education"][1]["school"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][1]["school"].blank?)
user.graduateschool_year = auth["extra"]["raw_info"]["education"][1]["year"]["name"] if (!auth["extra"].blank? && !auth["extra"]["raw_info"]["education"][1]["year"].blank?)
user.add_friends
user.save!
user
end
end
def add_friends
facebook.get_connections("me", "friends").each do |hash|
self.friends.where(:name => hash['name'], :uid => hash['id']).first_or_create
end
end
private
def facebook
@facebook ||= Koala::Facebook::API.new(token)
end
end
2 Respuestas
2
bundle exec rake db:reset
escriba el comando anterior.
Respondido 01 ago 13, 12:08
1
La cuestión es que, cuando el usuario presiona el método creado, el método from_omniauth (auth) verifica si existe un usuario, si el usuario no existe, comienza a crear el usuario y obtiene toda la información del hash de autenticación proporcionado por Facebook. Pero antes de guardar al usuario, llama al método add_friends, ¡el usuario aún no existe, por lo tanto, el error!
Entonces, primero debe guardar al usuario y luego llamar al método add_friends
¡Y Sqlite3 es incapaz de transacciones anidadas!
aclamaciones!
Respondido 02 Jul 12, 22:07
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails ruby ruby-on-rails-3 sqlite or haz tu propia pregunta.
Sqlite3 no puede realizar transacciones anidadas. - ergosys
sí, olvidé mencionar eso .. - user592638