2011-08-28 24 views
4
class TwitterProfile < ActiveRecord::Base 

    def send_status_update(status_update) 
    if publish? 
     client = Twitter::Client.new(:oauth_token => authentication.token, 
          :oauth_token_secret => authentication.secret) 
     client.update(status_update.to_twitter_string) 
    end 
    rescue Exception => e 
    logger.info "Error publishing to twitter: #{e.to_s}" 
    end 
end 

有一個StatusUpdate模型和一個觀察者將它們轉發到after_create中的Twitter。我有時出現以下情況例外:Ruby NameError undefined本地變量或方法`e

NameError (undefined local variable or method `e' for #<TwitterProfile:0x00000004e44ab8>): 
app/models/twitter_profile.rb:23:in `rescue in send_status_update' 
app/models/twitter_profile.rb:18:in `send_status_update' 
app/models/status_update_observer.rb:6:in `block in after_create' 
app/models/status_update_observer.rb:4:in `after_create' 
app/models/workout_observer.rb:5:in `after_update' 
app/controllers/frames_controller.rb:76:in `update' 
app/controllers/application_controller.rb:24:in `call' 
app/controllers/application_controller.rb:24:in `block (2 levels) in <class:ApplicationController>' 
app/controllers/application_controller.rb:10:in `block in <class:ApplicationController>' 

缺少什麼我在這裏?

+1

這很奇怪,但很有趣,它看起來像'=> e'的行爲不存在。 –

+1

注意:不要搶救'Exception' - rescue'StandardError'。見http://www.thattommyhall.com/2011/02/24/rescue-exception-harmful-signals-in-ruby/ – zetetic

回答

2

我有一件事我知道,一個只是一個瘋狂的猜測。

我知道的事情是,你不需要在總體#{}表達式上調用to_s;這將自動發生。但它沒有傷害。

我的猜測是你的測試用例並沒有真正運行你發佈的代碼。如果將e更改爲f,會發生什麼情況?

我應該注意到,拯救異常本身通常是一個壞主意。你應該救援RuntimeError或StandardError最高,最好是更具體的東西。因爲您干擾線程和解釋程序級別的事件,因此在恢復異常時可能會出現相當奇怪的錯誤。

+0

將該方法更改爲僅拯救Twitter :: Error。進行測試,看看是否能解決問題。 –

-1

你錯過了開始/救援條款的'開始'區塊。

+2

不,你可以在這個語法的函數中救援,這是有效的紅寶石。 –

相關問題