NoMethodError (неопределенный метод `info' для nil:NilClass) `find_for_google_oauth2'

! Я пытаюсь разрешить коллегам и студентам регистрироваться, используя свои учетные записи проектов Google. Я дошел до передачи токена, но затем я получаю сообщение об ошибке.

  1. app/models/user.rb:70:in `find_for_google_oauth2'

app/controllers/authentications_controller.rb:5:в `создать'

мой метод создания контроллера аутентификации

    def create
       auth = request.env[":google_oauth2"]
       @user = User.find_for_google_oauth2(request.env["omniauth.auth"])
       redirect_to root_url, :notice => "Signed in!"
   end

моя пользовательская модель

def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
       user.email = auth.info.email
       user.password = Devise.friendly_token[0,20]
       user.first_name = auth.info.first_name
       user.last_name = auth.info.last_name   # assuming the user model has a name
       user.image = auth.info.image # assuming the user model has an image
  end
 end

    def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
        data = access_token.info
        user = User.where(:email => data["email"]).first


    unless user
        user = User.create(name: data["name"],
             email: data["email"],
             uid: access_token.uid,
             provider: access_token.provider,
             password: Devise.friendly_token[0,20]
            )
          end
          user
        end

и мой конфиг/omniauth.rd

require 'omniauth-google-oauth2'

OmniAuth.config.logger = Rails.logger
  OmniAuth.logger.progname = "omniauth"
Rails.application.config.middleware.use OmniAuth::Builder do



    provider :google_oauth2, '***********petnk.apps.googleusercontent.com',
        google_client_secret: '***********',
        prompt: "consent",
        select_account: true,
        scope: 'userinfo.email',
        image_aspect_ratio: 'square',
        image_size: 50
        on_failure { |env|AuthenticationsController.action(:failure).call(env) }

    end

Не уверен, что включить, чтобы помочь вам помочь мне. Я новичок в рельсах и пытался учиться в течение прошлого года, поэтому любая помощь приветствуется.

спасибо


person Hodari Toure'    schedule 03.10.2017    source источник
comment
Есть ли способ проверить, что access_token в self. find_for_google_oauth2 не равно нулю?   -  person Sebastian Palma    schedule 03.10.2017
comment
@SebastiánPalma Хороший вопрос, не совсем уверен, как бы я это сделал? Теперь я немного синтаксиса, но я не могу найти его, и я искал везде.   -  person Hodari Toure'    schedule 04.10.2017
comment
Не уверен, почему я проголосовал без объяснений, я надеюсь, что это сообщество, чтобы помогать и учить, а не стыдить и увещевать.   -  person Hodari Toure'    schedule 04.10.2017
comment
Было бы хорошо оставлять сообщение каждый раз, когда кто-то минусует, если только причина не настолько очевидна, но я думаю, что это не тот случай. Поместите byebug сразу после определения метода, чтобы проверить значение, например def self.find_for_google_oauth2(access_token, signed_in_resource=nil); byebug, это остановит приложение, и вы сможете проверить эти переменные в том же рабочем процессе, но на вашем сервере rails.   -  person Sebastian Palma    schedule 04.10.2017
comment
@SebastiánPalma отличные предложения, вот каковы были результаты. Обработка с помощью AuthenticationController#create as HTML Параметры: {google_oauth2=›google_oauth2} [65, 74]... ноль); byebug => 70: data = access_token.info 71: user = User.where(:email =› data[email]).first 72: 73: если только пользователь 74: user = User.create(name: data[name], (до свидания)   -  person Hodari Toure'    schedule 04.10.2017
comment
Поместите byebug сразу после метода, так, когда приложение использует этот метод, сервер rails остановится, тогда вы можете ввести access_token и посмотреть, каково его значение.   -  person Sebastian Palma    schedule 04.10.2017
comment
@SebastiánPalma, спасибо за четкие, краткие инструкции и ссылку. Я сделал это, и access_token вернулся «ноль». Означает ли это, что он не получает токен должным образом? или хранить токен?   -  person Hodari Toure'    schedule 04.10.2017
comment
Да, с этой информацией и знанием того, как отлаживать, вы можете вернуться сейчас и проверить, откуда вы отправляете это значение, и проверить, почему оно равно нулю.   -  person Sebastian Palma    schedule 04.10.2017


Ответы (1)


Мне пришлось переместить функцию создания с контроллера аутентификации на омниконтроллер. не совсем уверен, почему это решило проблему, но на данный момент это сделало.

person Hodari Toure'    schedule 05.11.2017