2011-01-16 13 views
2

期待していなかったときは、nilのオブジェクトを持っている:OmniAuth/Railsの - あなたは私が私のRailsアプリケーションで次のエラーを取得していると私はデバッグやそれを修正について移動する方法が分からない、それ

NoMethodError in AuthenticationsController#create

を期待していないときは、オブジェクトがありません。 ActiveRecord :: Baseの インスタンスが必要になることがあります。 nilを評価しながら エラーが発生しました[]

Rails.root:。 /Users/phil/Sites/travlrapp.com アプリケーションのトレース|フレームワークトレース| 完全なトレース

アプリ/コントローラ/ 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が正常に動作するために使用され、その後、私はそれをマッシュflickrをサポートしていたptiltonによってフォークにスワップしようとしています。私はgemfileにgit =>を設定して再インストールしようとしましたが、私は正しくこれをやりました。

すべてのomniauthファイルとoa-foo gemファイルを手動で削除し、最初に現在の安定版(0.1.6)とgitマスターコピーをインストールしましたが、すべてのエラーは同じです。

本当にここで紛失していますが、誰も私が知っていることは問題が何であるかを知っていません。

答えて

1

あり

はまた「関数が呼び出されるかどうかを確認もあります。 Go Rails!

2

omniauthnilである可能性があります。 unless onmniauthでnilをチェックしている間に、redirect_toは実際には以下のコントローラコードの実行を停止しません。

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

さて、あなたはまだomniauthnilである理由を把握する必要があります。

は、おそらくこのような何かをしたいです。そのためには、READMEを見てOmniAuthを正しく使用していることを確認してください。 /auth/provider/callbackAuthenticationsController#createにルーティングされていますか?

+0

お返事ありがとうございます。うん、ルートは適切な場所にあります:http://d.pr/SoEj –

1

あなたはすでにこの方法を知っている場合(あなたはPHPの開発者です)、前もってお詫びします。

レールはdie()と似たPHPスタイルのデバッグをサポートしていますか? yiiとkohanaの両方のPHPフレームワークで、このような奇妙な理解できないエラーが発生しました。エラーがない前に、私は、コントローラacionの終わりにdie('AAAAA')を入れ、徐々にまでそれを上に移動されない何

ITがが、私はエラーだった正確に何行に知っている方法をトリガします。

それから、その行で呼び出された関数に移動して、やり直します。

レールがこの種の生のデバッグスタイルをサポートしているかどうかわかりません。また、それらの宝石のソースコードがコンパイルされていないコードにある場合に役立ちますので、die()をそのような場所に挿入することができます。

echo 'AAA'; exit;などと同等の機能を実行できます。 die('BBBBB');::P

をあなたが本当に行きたい進んだ場合も

これは、ランダムに自分自身を修正するように見えたdie("AAAAA ".' '.__FILE__.'::Line:'.__LINE__);

+0

もちろん、この種のデバッグはPHPではうまく動作しますが、Railsでは少し違います。ブラウザの代わりにコンソールに出力するためにputs "foo"を使うことができます。これは、レールがその行を読み取ったことを示す "ブレークポイント"のように動作します。デバッグの際に問題となっていたPutsは無視されていたようですが、今は動作しているようです。それは変だ。 –

+0

Ruby 1.9を使用している場合は、別の 'puts'文を追加せずに' Object#tap'を使ってデバッグコードを注入することもできます。こちらをご覧ください:http://blog.moertel.com/articles/2007/02/07/ruby-1-9-gets-handy-new-method-object-tap –

+1

また、オブジェクトを 'raise'することもできます(' raiseオムニオス)。エラーが発生し、オブジェクトをきれいに印刷します。 –

関連する問題