2011-01-16 2 views
2

Ich erhalte die folgenden Fehler in meiner Rails-Anwendung, und ich habe keine Ahnung, wie zu dem Debuggen gehen oder es zu reparieren:OmniAuth/Rails - Sie haben ein Null-Objekt, wenn Sie es nicht erwarten

NoMethodError in AuthenticationsController # create

Sie haben ein Null-Objekt, wenn Sie nicht erwarten es! Sie haben möglicherweise eine Instanz von ActiveRecord :: Base erwartet. Der Fehler trat bei null Auswertung []

Rails.root. /Users/phil/Sites/travlrapp.com Anwendung Trace | Rahmenverfolgung | Voll Trace

app/controllers/authentications_controller.rb: 15: in `erstellen‘

Der Controller ist dies:

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 verwendet funktionieren, dann püriert ich es up versucht, zu einer Gabel von Pchilton, die flickr unterstützt auszutauschen. Ich habe dies getan, indem ich: git => in der gemfile und versuche, neu zu installieren, aber ich bin nicht zuversichtlich, dass ich es jemals richtig gemacht habe.

Ich habe jetzt alle omniauth und oa-foo gem Dateien manuell entfernt und zuerst die aktuelle stable (0.1.6) und die Git Master Kopie installiert, aber alle Fehler sind gleich.

Wirklich ratlos hier, niemand, den ich kenne, hat eine Ahnung, was das Problem ist.

Antwort

1

Dies schien ist nach dem Zufallsprinzip selbst zu beheben. Geh Schienen!

2

Es ist wahrscheinlich, dass omniauthnil ist. Während Sie mit unless onmniauth nach Null suchen, stoppt die redirect_to den Controller-Code unten tatsächlich nicht von der Ausführung.

Sie wollen wahrscheinlich etwas wie folgt aus:

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

Nun müssen Sie noch, um herauszufinden, warum omniauthnil ist. Stellen Sie sicher, dass Sie OmniAuth korrekt verwenden, indem Sie auf schauen. Ist /auth/provider/callback auf AuthenticationsController#create geroutet?

+0

Hey, danke für die Antwort. Ja, die Routen sind vorhanden: http://d.pr/SoEj –

1

Ich entschuldige mich im Voraus, wenn Sie diese Methode bereits kennen (Sie sind immerhin ein PHP-Entwickler).

Unterstützt Rails PHP-Debugging ähnlich wie die()? Ich habe in yii und kohana php-Gerüsten einen seltsamen, unverständlichen Fehler gefunden.

Was ich tue, ist ein die('AAAAA') am Ende des Controllers acion setzen, und es nach und nach, bis nach oben IT ausgelöst wird, bevor der Fehler der Fall ist, so weiß ich genau, was Linie der Fehler war.

Dann verschiebe ich es in die Funktion, die in dieser Zeile aufgerufen wird, und beginne erneut.

Ich weiß nicht, ob Rails diese Art von rohen Debug-Stil unterstützt.Es würde auch helfen, wenn der Quellcode für diese Edelsteine ​​nicht kompilierten Code wäre, so dass Sie überall einfügen können.

Sie könnten etwas wie das Äquivalent von echo 'AAA'; exit; oder etwas ähnliches tun.

Auch gibt es auch die ‚überprüfen, ob eine Funktion aufgerufen wird: die('BBBBB');: P

Wenn Sie wirklich gehen wollen voran auch

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

+0

Sicher, diese Art von Debugging funktioniert gut in PHP, aber es ist ein wenig anders in Rails. Sie können puts "foo" anstelle des Browsers für die Ausgabe auf der Konsole verwenden. Dieser fungiert als "Haltepunkt" und zeigt an, dass rails diese Zeile gelesen hat. Puts schien für mich ignoriert zu werden, was ein Problem mit dem Debugging war, scheint aber jetzt zu funktionieren. Was ist komisch. –

+0

Wenn Sie Ruby 1.9 verwenden, können Sie auch 'Object # tap' verwenden, um Debugging-Code zu injizieren, ohne separate' puts'-Anweisungen hinzuzufügen. Siehe hier: http://blog.moertel.com/articles/2007/02/07/ruby-1-9-gets-handy-new-method-object-tap –

+1

Sie können das Objekt auch "erhöhen" ('raise Omniauth'). Es wird einen Fehler verursachen und das Objekt schön ausdrucken. –

Verwandte Themen