在Rails中使用rescue自动环绕方法

时间:2013-03-06 14:32:36

标签: ruby-on-rails

我正在关注此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的每个方法。

2 个答案:

答案 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