Наследовать модуль HTTParty - PullRequest
0 голосов
/ 06 мая 2020

Как я могу унаследовать модуль HTTParty, чтобы установить некоторые значения по умолчанию?

module SuperClient
  include HTTParty

  headers 'Auth' => 'Basic'
end

module ServiceApiClient
  include SuperClient

  headers 'X-Prop' => 'Some specific data'
  base_uri 'https://example.com'

  def self.posts
    self.get '/posts'
    # Expected to send headers Auth and X-Prop
  end
end

Мне нужен настраиваемый модуль, который можно включить в классы клиентов и вести себя как собственный модуль HTTParty.

Ответы [ 2 ]

1 голос
/ 11 мая 2020

Если единственное намерение состоит в том, чтобы установить значения по умолчанию, а не переопределять методы, то следующий трюк поможет: некоторые значения по умолчанию. Если это единственная функция, которая вам нужна, это ваш ответ, если вы также планируете переопределить методы, читайте дальше.


Это не работает, если вы планируете пересмотреть методы. HTTParty будет добавлен в стек предков перед SuperClient. При вызове методов, определенных как SuperClient, так и HTTParty, первым будет вызываться вариант HTTParty, то есть вариант SuperClient никогда не будет достигнут.

Это может быть больше информации, чем вам нужно, но указанную выше проблему можно решить, выполнив:

module SuperClient
  def self.included(base)
    base.include HTTParty
    base.include InstanceMethods
    base.extend  ClassMethods

    # defaults
    # ...
  end

  module InstanceMethods
    # ...
  end

  module ClassMethods
    # ...
  end
end

Включив InstanceMethods и расширив ClassMethods после включения HTTParty, они будут располагаться выше в стеке, что позволит вам повторно определить методы и вызвать super.

class C
  include SuperClient
end

# methods are search for from top to bottom
puts C.ancestors
# C
# SuperClient::InstanceMethods
# HTTParty::ModuleInheritableAttributes
# HTTParty
# SuperClient
# Object
# JSON::Ext::Generator::GeneratorMethods::Object
# Kernel
# BasicObject

puts C.singleton_class.ancestors
# #<Class:C>
# SuperClient::ClassMethods
# HTTParty::ModuleInheritableAttributes::ClassMethods
# HTTParty::ClassMethods
# #<Class:Object>
# #<Class:BasicObject>
# Class
# Module
# Object
# JSON::Ext::Generator::GeneratorMethods::Object
# Kernel
# BasicObject
1 голос
/ 09 мая 2020

Вы можете сохранить SuperClient как класс и наследовать от него других клиентов. Что-то вроде этого. Оба заголовка Auth и X-Prop будут включены в запрос.

require 'httparty'

class SuperClient 
    include HTTParty

    headers 'Auth' => 'Basic'
    # Uncomment below line to print logs in terminal
    # debug_output STDOUT
end

class ServiceApiClient < SuperClient

    headers 'X-Prop' => 'Some specific data'
    base_uri 'https://example.com'

    def posts
        self.class.get '/posts'
        # Expected to send headers Auth and X-Prop
  end
end         

client = ServiceApiClient.new

client.posts()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...