2012-03-27 12 views
6

Ho combattuto questo problema tutto il giorno e avrei potuto davvero bisogno di qualche input.Facebook Open Graph da Rails Heroku

Ho un'applicazione Rails (3.1.3) in esecuzione su Heroku Cedar, cercando di pubblicare alcune azioni di Facebook Open Graph con gem fb_graph (2.4.0).

Questo è il mio codice.

begin 
    app = FbGraph::Application.new(ENV['facebook_app_id']) 
    me = FbGraph::User.me(user.facebook_access_token) 

    logger.info "Facebook: User #{user.name} reviewing game #{game_url(review.game)}" 

    action = me.og_action!(
     app.og_action(:review), 
     :game => game_url(review.game), 
     :content => review.review, 
     :rating => review.rating 
    ) 
rescue Exception => exc 
    logger.error "Failed to publish review #{review.id} to facebook #{user.facebook_auth}" 
    logger.error "Facebook error msg: #{exc.message}" 
end 

Se vado alla pagina dell'applicazione che tenterà di eseguire questo codice, non riuscirà con il seguente messaggio.

FbGraph::InvalidRequest (Exception :: Could not retrieve data from URL.) 

Ma, se io dove aprire una console Heroku, heroku run console e digitare il codice a mano, funziona perfettamente.

Il mio primo pensiero è stato quello di dare la colpa a game_url(review.game), ma dopo aver aggiunto il messaggio di registro, sono sicuro che restituisce l'URL corretto. E poiché tutto funziona quando lo eseguo manualmente attraverso la console di heroku, conferma che l'URL è accessibile e fornisce i dati richiesti.

Qualsiasi feedback o esperienza con questo è molto apprezzato.

+0

Hai provato a cambiare ENV [ 'facebook_app_id'] e compreso l'ID proprio lì? Ho avuto problemi con Facebook e variabili di ambiente prima. – Ashitaka

+0

Valeva la pena provare, ma purtroppo nessun effetto. Ho anche provato ad aggiungere il segreto, anche se non dovrebbe essere necessario. –

+0

Fb_graph aggiornato alla versione 2.4.7 senza alcun effetto. –

risposta

11

Risolto!

Davvero stupido in realtà. Ho avuto un solo banco virtuale nella mia applicazione Heroku. Dal momento che la mia unica web dyno stava facendo la chiamata dell'API di Facebook, non c'era nessun banco di prova per rispondere al callback di Facebook. Hai bisogno di almeno 2 per farlo funzionare.

Il motivo per cui il codice ha funzionato nella console di heroku era semplicemente perché il web dyno non era occupato nella gestione della mia richiesta.

Potrei spingere quel codice in una coda di lavoro in futuro in quanto sembra più appropriato e lasciare che un addetto operaio gestisca la pubblicazione su Facebook.

+0

Non dimenticare di accettare la tua risposta! – Ashitaka

+1

Si noti che, anche con due dynos, è ancora possibile bloccare se il router invia la richiesta al banco prova errato.Ho suggerito l'Unicorno in un'altra risposta; un'altra alternativa è usare una seconda app per implementare il callback, anche se non sono sicuro che la gem fb_graph sia adatta a questo. – metadaddy

+0

@metadaddy, Heroku dice che più di un banco di prova fornisce più concorrenza. Se ho due dynos, perché è routing allo stesso banco di prova? Quale router invia al banco prova sbagliato? – Tony

0

Il seguente collegamento sembra suggerire che questo è timeout correlato, sebbene non sia stata ancora fornita alcuna soluzione reale. facebook "could not retrieve data from URL"

Si consiglia inoltre di tenere traccia delle risposte per il collegamento sopra.

+0

Grazie per il link. Bello vedere che non sono solo. Non sono sicuro della cosa del timeout. Ci vogliono ~ 400ms per rendere la pagina game_url. Non dovrebbe valere un timeout giusto? Vale la pena indagare. Grazie. –

Problemi correlati