2

私は omniauth を使用して作業しておりRails、認証のために Twitter、Facebook、および Google を接続しようとしていますが、このエラーが引き続き発生します。

PG::Error: ERROR:  duplicate key value violates unique constraint "index_users_on_email"
DETAIL:  Key (email)=() already exists.

これが私の認証コントローラーです:

class AuthorizationsController < ApplicationController


      def create
        authentication = Authorization.find_by_provider_and_uid(auth['provider'], auth['uid'])

        if authentication
          flash[:notice] = "Signed In Successfully"
          sign_in authentication.user, event: :authentication
          redirect_to root_path
        else
          athlete = Athlete.new
          athlete.apply_omniauth(auth)

          debugger

          if athlete.save(validate: false)
            flash[:notice] = "Account created and signed in successfully"
            sign_in athlete, event: :authentication
            redirect_to finalize_profile_path
          else
            flash[:error] = "An error has occurred. Please try again."
            redirect_to root_path
          end
        end
      end

      def failure
        render json: params.to_json
      end

      private

        def auth
          request.env["omniauth.auth"]
        end

        def resource(user_type)
          user_type.downcase.to_sym
        end

    end

何が起こっているのかと思いますが、アスリートが作成されるときに、空のメール アドレスを持つアスリートが作成され、一意のキーが失敗していると思います...どうすればこれを回避できますか? Google 統合のためにこれを修正する方法はわかっていると思いますが、Twitter はメールを返さないため、この問題は解決しません。

4

1 に答える 1

1

これが私がそれを機能させることができた方法です:

class AuthorizationsController < ApplicationController

  def create
    authentication = Authorization.find_by_provider_and_uid(auth['provider'], auth['uid'])

    if authentication
      flash[:notice] = "Signed In Successfully"
      sign_in authentication.user, event: :authentication
      redirect_to root_path
    else
      athlete = Athlete.new(email: generate_auth_email(params[:provider]) )
      athlete.apply_omniauth(auth)

      debugger

      if athlete.save(validate: false)
        flash[:notice] = "Account created and signed in successfully"
        sign_in athlete, event: :authentication
        redirect_to finalize_profile_path
      else
        flash[:error] = "An error has occurred. Please try again."
        redirect_to root_path
      end
    end
  end

  def failure
    render json: params.to_json
  end

  private

    def auth
      request.env["omniauth.auth"]
    end

    def resource(user_type)
      user_type.downcase.to_sym
    end

    def generate_auth_email(provider)
      return auth.info.try(:email) unless provider == "twitter"
      return "#{auth.uid}@twitter.com" if provider == "twitter"
    end

end

Twitter はメールアドレスを返さないため、twitter.com をドメインとして、Twitter の uid を使用してメールを作成します。

これが将来誰かに役立つことを願っています

于 2013-07-10T20:15:38.787 に答える