if @ user.persisted?与Facebook omniauth |设计

时间:2013-08-28 05:51:53

标签: ruby-on-rails oauth devise omniauth facebook-oauth

我的 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

1 个答案:

答案 0 :(得分:2)

我不能100%确定原因,因为还有其他一些信息。

我建议:

  1. 更改此行

    @user ||= User.find_for_facebook_oauth ...
    

    @user = User.find_for_facebook_oauth
    

    这是为了消除其他可能的影响,并且没有必要缓存@user,因为此操作不会经常被点击。

  2. 确保添加并迁移了provideruidname列。

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

    如果仍不确定,请调试此User方法。

  4. <强>更新

    好的,有理由。你有一个验证:

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

    但是在Facebook属性中,没有这样的属性:user_name,因此保存将失败。

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