OmniAuth / Rails - у вас есть нулевой объект, когда вы его не ожидали - PullRequest
2 голосов
/ 16 января 2011

В моем приложении на Rails появляется следующая ошибка, и я не знаю, как ее отладить или исправить:

NoMethodError in AuthenticationsController # создать

У вас есть нулевой объект, когда вы этого не сделали ожидайте этого! Вы могли ожидать экземпляр ActiveRecord :: Base. произошла ошибка при оценке nil. []

Rails.root: /Users/phil/Sites/travlrapp.com Трассировка приложений | Framework Trace | Полная трассировка

приложение / контроллеры / authentications_controller.rb: 15: в `Создать '

Контроллер это:

class AuthenticationsController < ApplicationController
  def index
    @authentications = current_user.authentications if current_user
  end

    def create

        omniauth = request.env["omniauth.auth"]

        unless omniauth
            redirect_to authentications_url
            flash[:notice] = "Could not authenticate via #{params['provider']}."
        end

        authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
        if authentication
            flash[:notice] = "Signed in successfully."
            sign_in_and_redirect(:user, authentication.user)
        elsif current_user

            current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => omniauth['credentials']['token'], :secret => omniauth['credentials']['secret'])
            flash[:notice] = "Authentication successful."
            redirect_to authentications_url
        else
            user = User.new
            user.apply_omniauth(omniauth)
            if user.save
                flash[:notice] = "Signed in successfully."
                sign_in_and_redirect(:user, user)
            else
                session[:omniauth] = omniauth.except('extra')
                redirect_to new_user_registration_url
            end
        end
    end


  def destroy
    @authentication = current_user.authentications.find(params[:id])
    @authentication.destroy
    flash[:notice] = "Successfully destroyed authentication."
    redirect_to authentications_url
  end
end

Раньше OmniAuth работал нормально, затем я разобрал его, пытаясь переключиться на форк через pchilton, который поддерживал flickr. Я сделал это, установив: git => в gemfile и попытавшись переустановить его, но я не уверен, что когда-либо делал все правильно.

Теперь я вручную удалил все файлы gem omniauth и oafoo и сначала установил текущую стабильную версию (0.1.6) и мастер-копию git, но все ошибки одинаковы.

Здесь, действительно, в растерянности, никто из тех, кого я знаю, понятия не имеет, в чем проблема.

Ответы [ 3 ]

2 голосов
/ 16 января 2011

Вероятно, что omniauth равно nil. Пока вы проверяете nil с помощью unless onmniauth, redirect_to на самом деле не останавливает выполнение приведенного ниже кода контроллера.

Вы, вероятно, хотите что-то вроде этого:

unless omniauth
  redirect_to authentications_url
  flash[:notice] = "Could not authenticate via #{params['provider']}."
  return
end

Теперь вам все еще нужно выяснить, почему omniauth равно nil. Для этого убедитесь, что вы правильно используете OmniAuth, посмотрев на README . /auth/provider/callback маршрутизируется на AuthenticationsController#create?

1 голос
/ 26 января 2011

Это, казалось, случайно исправило себя. Go Rails!

1 голос
/ 17 января 2011

Я заранее прошу прощения, если вы уже знаете этот метод (в конце концов, вы - разработчик php).

Поддерживает ли rails отладку в стиле php, аналогичную die()?Я столкнулся со странной непонятной ошибкой, подобной этой, в фреймворках php yii и kohana.

Что я делаю, так это помещаю die('AAAAA') в конце контроллера и постепенно перемещаю его вверх до IT запускается раньше, чем происходит ошибка, поэтому я точно знаю, в какой строке была ошибка.

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

Iне знаю, поддерживает ли rails этот вид необработанного стиля отладки.Также будет полезно, если исходный код для этих драгоценных камней находится в не скомпилированном коде, поэтому вы можете вставить die() повсюду, как это.

Вы можете сделать что-то вроде echo 'AAA'; exit; или что-то подобное.

Также есть проверка, если функция вызывается: die('BBBBB');: P

Если вы хотите продвинуться по-настоящему, есть также

die("AAAAA ".' '.__FILE__.'::Line:'.__LINE__);

...