2013-03-06 57 views
0

我跟隨此RailsCast on Facebook API。以下代碼允許將塊傳遞給facebook方法並受益於rescue在Rails中自動環繞救援方法

def facebook 
    @facebook ||= Koala::Facebook::API.new(oauth_token) 
    block_given? ? yield(@facebook) : @facebook 
    rescue Koala::Facebook::APIError => e 
    logger.info e.to_s 
    nil # or consider a custom null object 
    end 

    def friends_count 
    facebook { |fb| fb.get_connection("me", "friends").size } 
    end 

不過,我來調用這裏定義facebook方法方法一打,我不希望在每個人重複facebook {}。 (語法不是特別好)。

有沒有辦法簡化這個?就像一個過濾器,它將環繞每個調用facebook的方法。

+2

你的代碼是明確的,我會保留它 – apneadiving 2013-03-06 14:55:39

+0

@apneadiving謝謝。這說得通。 – AdamNYC 2013-03-06 15:07:24

回答

1
+0

感謝您的回答。你能否詳細說明我可以如何使用委託來處理這種情況?我閱讀博客文章,但仍不確定如何去做。 – AdamNYC 2013-03-06 15:11:02

+0

也很想在這種情況下看到委派 – apneadiving 2013-03-06 15:12:51

+0

想法是,你可以在你的函數調用中委託給@facebook實例,但是我想你會遇到問題,而沒有捕獲那裏的異常。我也提出了「apneadiving」的評論。我認爲你應該保持原樣。 – deepflame 2013-03-06 16:30:19

0

這是一個老問題,但我只是碰到它,一個可能的答案跑了,所以我會在這裏的情況下離開這個任何人有興趣。它來自websocket-ruby。這個想法是提供一個一致的方式來提供方法,無論是否有救援包裝爲您的享受。

module WebSocket 
    module ExceptionHandler 
    attr_accessor :error 

    def self.included(base) 
     base.extend(ClassMethods) 
    end 

    module ClassMethods 
     # Rescue from WebSocket::Error errors. 
     # 
     # @param [String] method_name Name of method that should be wrapped and rescued 
     # @param [Hash] options Options for rescue 
     # 
     # @options options [Any] :return Value that should be returned instead of raised error 
     def rescue_method(method_name, options = {}) 
     define_method "#{method_name}_with_rescue" do |*args| 
      begin 
      send("#{method_name}_without_rescue", *args) 
      rescue WebSocket::Error => e 
      self.error = e.message.to_sym 
      WebSocket.should_raise ? raise : options[:return] 
      end 
     end 
     alias_method "#{method_name}_without_rescue", method_name 
     alias_method method_name, "#{method_name}_with_rescue" 
     end 
    end 
    end 
end