Facebook 用户通过Omniauth(Rails 3)从Desive成功登录后未存储在数据库中

Facebook 用户通过Omniauth(Rails 3)从Desive成功登录后未存储在数据库中,facebook,ruby-on-rails-3,devise,omniauth,Facebook,Ruby On Rails 3,Devise,Omniauth,即使omniauth控制器确认成功登录,我似乎也无法从数据库中保存用户。我按照omniauth wiki的说明进行操作: user.rb: class User < ActiveRecord::Base # Include default devise modules. Others available are: # :token_authenticatable, :confirmable, # :lockable, :timeoutable and :omniauthable dev

即使omniauth控制器确认成功登录,我似乎也无法从数据库中保存用户。我按照omniauth wiki的说明进行操作:

user.rb:

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :encrypted_password, :provider, :uid
attr_accessor :email, :password, :password_confirmation, :remember_me, :provider,   :uid, :name

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.email = auth.info.email
user.encrypted_password = Devise.friendly_token[0,20]
user.save!
end
end



def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
  user = User.where(:provider => auth.provider, :uid => auth.uid).first
  unless user
    user = User.create(
                         provider:auth.provider,
                         uid:auth.uid,
                         email:auth.info.email,
                         encrypted_password:Devise.friendly_token[0,20]
                         )
  #user.ensure_authentication_token!
  #added extra to create authentication for user
  user.save
  end
  user
end

def self.new_with_session(params, session)
super.tap do |user|
  if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
    user.email = data["email"] if user.email.blank?
  end
end
end
end
class用户auth.provider,:uid=>auth.uid)。首先
除非用户
user=user.create(
提供者:auth.provider,
uid:auth.uid,
电子邮件:auth.info.email,
加密密码:Desive.friendly_令牌[0,20]
)
#user.sure\u身份验证\u令牌!
#添加了额外的用于为用户创建身份验证
user.save
结束
用户
结束
定义self.new_与_会话(参数,会话)
super.tap do| user|
如果数据=会话[“designe.facebook_数据”]&会话[“designe.facebook_数据”][“额外”][“原始信息”]
user.email=data[“email”]如果user.email.blank?
结束
结束
结束
结束
omniauth_callback_controller.rb:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

def passthru
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
# Or alternatively,
# raise ActionController::RoutingError.new('Not Found')
end

def facebook
# You need to implement the method below in your model (e.g. app/models/user.rb)
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
#@user = User.from_omniauth(request.env["omniauth.auth"])

if @user.persisted?
  sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
  set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
else
  session["devise.facebook_data"] = request.env["omniauth.auth"]
  #redirect_to new_user_registration_url
  redirect_to messages_url
end
end
end
class Users::OmniAuthCallbackController“#{Rails.root}/public/404.html”,:status=>404,:layout=>false
#或者,
#raise ActionController::RoutingError.new('未找到')
结束
def facebook
#您需要在模型中实现以下方法(例如app/models/user.rb)
@user=user.find\u for\u facebook\u oauth(request.env[“omniauth.auth”],当前用户)
#@user=user.from_omniauth(request.env[“omniauth.auth”])
如果@user.persistent?
登录并重定向@user,:event=>:authentication#如果未激活@user,将引发此错误
如果是导航格式,设置flash消息(:notice,:success,:kind=>“Facebook”)?
其他的
会话[“designe.facebook_data”]=request.env[“omniauth.auth”]
#将\重定向到新\用户\注册\ url
将\u重定向到邮件\u url
结束
结束
结束

我已经尝试使用默认的Desive控制器登录,它会通过用户数据库。由于我无法存储到数据库,我也无法获取uid

通过使用不同的方法创建新的应用程序,我找到了解决方案

更新user.rb find_for_facebook_auth:

    def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
  user = User.where(:provider => auth.provider, :uid => auth.uid).first
  unless user
    user = User.create(
                         provider:auth.provider,
                         uid:auth.uid,
                         email:auth.info.email,
                         password:Devise.friendly_token[0,20]
                         )

  end
  user
end
然后user.rb的属性为:

    attr_accessible :email, :password, :password_confirmation, :remember_me, :provider, :uid, :oauth_token, :oauth_expires_at
成功登录后,用户将保存到数据库。

我还决定将Tumblr身份验证添加到现有的Desive用户模型中。事实证明,Deave在电子邮件数据库索引上抛出了一个错误

网络上没有人有这个问题,所以我想我应该把它扔出去。我花了很长时间想弄明白。很高兴你解决了:)