Pregunta

Estoy recibiendo el siguiente error en mi aplicación Rails y no tengo ni idea de cómo ir sobre la depuración o la fijación de él:

NoMethodError en AuthenticationsController # crea

tiene un objeto nulo cuando no lo hizo ¡Esperar algo! Que podría haber esperado una instancia de ActiveRecord :: Base. los error ocurrió al evaluar nula. []

Rails.root: /Users/phil/Sites/travlrapp.com Aplicación de seguimiento | Marco de seguimiento | Traza completa

app / controllers / authentications_controller.rb: 15: en `Crear '

El controlador es la siguiente:

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 utiliza para trabajo fino, entonces me aplastó a tratar de permuta a un tenedor por pchilton que apoyó flickr. Hice esto mediante el establecimiento:. Git => en el Gemfile y tratar de volver a instalar, pero no soy yo seguro de que he hecho las cosas bien

Ahora he eliminado manualmente todos los archivos OmniAuth y gema foo OA e instalado por primera vez el estable actual (0.1.6) y la copia maestra git, pero todos los errores son los mismos.

realmente en una pérdida aquí, nadie que yo conozca tiene alguna idea de cuál es el problema.

¿Fue útil?

Solución 3

Esto parecía para fijar de forma aleatoria en sí. Rieles Go!

Otros consejos

Es probable que omniauth es nil. Mientras que usted está mirando para nula con unless onmniauth, la redirect_to en realidad no detener el código del controlador por debajo de la ejecución.

Es posible que desee algo como esto:

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

Ahora, usted todavía tiene que averiguar por qué omniauth es nil. Por eso, asegúrese de que está utilizando correctamente OmniAuth mirando el README . Se encamina a /auth/provider/callback AuthenticationsController#create?

Me disculpo de antemano si ya conoce este método (usted es un desarrollador de PHP después de todo).

¿El estilo de los carriles de soporte de depuración de PHP similar a die()? Me he encontrado el error incomprensible raro como esto en ambos marcos php Yii y Kohana.

Lo que hago es poner una die('AAAAA') al final de la acion controlador, y poco a poco moverlo hacia arriba hasta que se desencadena antes que el error, de esa manera sé exactamente en qué línea el error fue .

A continuación, me muevo en cualquier función que se llama en esa línea y empezar de nuevo.

No sé si carriles soportes este tipo de estilo de depuración prima. También sería de ayuda si el código fuente de esas joyas están en código noncompiled para que pueda insertar die() por todo el lugar como ese.

Se podría hacer algo así como el equivalente de echo 'AAA'; exit; o algo similar.

También existe también el 'cheque si una función se llama: die('BBBBB');: P

Si quieres ir muy avanzado también hay

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top