1

我的Omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
    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)

        if @user.persisted?
            # This will throw if @user is not activated
            sign_in_and_redirect @user, event: :authentication
            if is_navigational_format?
                set_flash_message(:notice, :success, kind: "Facebook")
            end
        else
            session["devise.facebook_data"] = request.env["omniauth.auth"]
            redirect_to new_user_registration_url
        end
    end
end

没有问题,没有日志。但是,当有人尝试通过 Facebook 连接时,它会将他们简单地扔到默认的注册表单中。

http://localhost:3000/sign_up#_=_

我的用户模型

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable, #:recoverable
         :rememberable, :trackable, :validatable, :omniauthable,
                 :omniauth_providers => [:facebook]


    # Facebook Settings
    def self.find_for_facebook_oauth(auth, signed_in_resource = nil)
        user = User.where(provider: auth.provider, uid: auth.uid).first
        if user.present?
            user
        else
            user = User.create(first_name:auth.extra.raw_info.first_name,
                                                 last_name:auth.extra.raw_info.last_name,
                                                 facebook_link:auth.extra.raw_info.link,
                                                 provider:auth.provider,
                                                 uid:auth.uid,
                                                 email:auth.info.email,
                                                 password:Devise.friendly_token[0,20])
        end
    end



    validates :first_name, :presence => true
    validates :email, :presence => true
    validates :user_name, :presence => true, :uniqueness => true

    has_many :clips
    has_one :show, dependent: :destroy

    # Profile Page Avatar
    has_attached_file :avatar, styles: { avatar: "64x64#"},
                                        :default_url => "http://placehold.it/150x150&text=Missing"

    validates_attachment :avatar,
                                             content_type: { content_type: ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'] },
                                             size: { less_than: 5.megabytes }

    # Profile Page Cover
    has_attached_file :profile_cover, styles: { cover: "870x150#"},
                                        :default_url => "http://placehold.it/150x150&text=Missing"

    validates_attachment :profile_cover,
                                             content_type: { content_type: ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'] },
                                             size: { less_than: 5.megabytes }


    # For Using the username instead of ID in the Link
    def to_param
        user_name
    end

end
4

1 回答 1

2

我不是 100% 确定原因,因为还涉及其他一些信息。

我会建议:

  1. 更改此行

    @user ||= User.find_for_facebook_oauth ...
    

    @user = User.find_for_facebook_oauth
    

    这是为了消除其他可能的影响,缓存@user没有什么意义,因为这个动作不会经常被命中。

  2. 确保已添加和迁移了provideruid、列。name

  3. 原因应该是@user 没有持久化,所以在创建用户时可能会出现问题。您可以更改createcreate!查看引发的错误。

    如果仍然不确定,请调试此用户方法。

更新

好的,知道原因了。你有一个验证:

validates :user_name, :presence => true, :uniqueness => true

但是在 Facebook 属性中,没有这个属性:user_name,所以保存会失败。

修复只是使用一种方法将此属性添加到 Facebook 哈希,或者不验证此属性。

于 2013-08-28T06:43:47.120 回答