3

初心者の質問:私はコアラとのFacebookから自分のユーザー権限を確認しようとしているrescue_fromコアラの例外おそらく

。場合によっては、私はエラーを投げつけるつもりです。だから私はそれをキャッチして、再認証するためにリダイレクトしたいだけです。

def check_facebook_permissions 
    if token = current_user.try(:authentications).find_by_provider('facebook').try(:token) 
     graph = Koala::Facebook::API.new(token) 
     permissions = graph.get_connections('me','permissions') 
     session[:facebook] = {} 
     session[:facebook][:ask_publish_actions] = true if permissions[0]['publish_actions'] != true && permissions[0]['publish_stream'] != true 
    end 
    rescue_from Koala::Facebook::APIError 
    # Do something funky here 
    end 

私はこれは簡単だと思っていましたが、私は救助を打つことはありません。代わりに私は得る:

Koala::Facebook::APIError (OAuthException: Error validating access token: Session has expired at unix time 1324026000. The current unix time is 1324352685.): 

私はここで何が欠けていますか?

答えて

8

rescue_fromは、Rubyの構文構造ではありませんrescueです - これは正常な関数であり、それに付随するブロックが必要です。あなたのコードでは、rescue_fromが実行され、効果的にスキップされます.の代わりに、putsのような他の関数を置いた場合と同様に、その前に発生した例外に関係しません。

rescue_fromの例を参照してくださいhereを参照してください。

このコードの動作をするために、あなたはバニラルビーrescueが必要になります。

rescue Koala::Facebook::APIError => e 
+0

AAAAA ...私を殺しました。ありがとう! – TLK

0

Rubyでのエラーを処理するための正しい構文は次のとおりです。

begin 
    # do something that will throw an error 
rescue StandardError => e # StandardError is the root class of most errors 
    # rescue the error 
end 
+1

他の区切り文字がある場合、 'begin'は必要ありません。この場合、「def」で十分である。 'begin'は、レスキュー可能な部分を' xxxx ... end'構造ではない構文領域に制限したいときに使われます。 – Amadan

関連する問題