7

herokuでホストされているアプリでdevise、omniauth(facebook-omniauthを含む)を使用してFacebook認証を設定しようとしています。Facebook APIの呼び出しは機能しますが、コールバック後の確認手順をスキップできません。

omn​​iauthのgithubチュートリアルに従いました:https ://github.com/plataformatec/devise/wiki/OmniAuth:-概要

また、これを読んで実装しようとしました: Skip_confirmationを考案してください!動作しない

しかし、herokuログに次のエラーが表示され続けます:

NoMethodError (undefined method `skip_confirmation!')

これが私のdevise.rbの外観です:

config.omniauth :facebook, "API_KEY", "API_SECRET"    

{:strategy_class => OmniAuth::Strategies::Facebook,
:scope => 'email, offline_access', :client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}}

これが私の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?
     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
   end
  end
end 

これが私のuser.rbモデルです:

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.new(name:auth.extra.raw_info.name,
                    provider:auth.provider,
                    uid:auth.uid,
                    email:auth.info.email,
                    password:Devise.friendly_token[0,20],
                    )
       user.skip_confirmation!
       user.save
  end
  user
end

ご協力いただきありがとうございます !

4

1 に答える 1

17

したがって、私が正しい場合 (100% 安全ではない)、モデルに確認可能なモジュールがあることを宣言し、確認可能なモジュールを追加する必要があります。

   devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :confirmable

そして、確認可能なモジュールのフィールドが users テーブルにあることを確認してください。フィールド Confirmation_token および Confirmed_at が必要です。

これらのフィールドがない場合は、この回答でそれらを追加する方法を確認してください。

于 2012-12-05T11:54:32.597 に答える