我正在关注此RailsCast on Facebook API。以下代码允许将块传递给facebook
方法并从rescue
中受益。
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
的每个方法。
答案 0 :(得分:1)
答案 1 :(得分: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