где я могу реализовать вызовы для внешних клиентов в приложении rails

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я пишу приложение rails, которое выполняет вызовы нескольким внешним веб-API, например Geonnames. Моя идея состоит в том, чтобы зафиксировать эту логику в отдельных модулях или классах и вызывать их из моих классов model и controller. Существуют ли какие-либо рекомендации по размещению такого кода? Должен ли это быть отдельный класс модели неактивной записи или модуль в папке lib? Или лучше просто реализовать вызовы WS как статические методы в классах ActiveRecord, где они мне нужны?

Спасибо

Ответ №1:

Есть несколько способов сделать это, но в целом я придерживаюсь следующих принципов.

  1. Они живут в /lib (если у вас их много, вы можете создать /lib/clients вспомогательный каталог)
  2. У них есть такие имена, как GeonamesClient или GeonamesWrapper
  3. Это класс, который вы должны создать
  4. Они могут наследоваться от базового класса (или, возможно, смешивать некоторые базовые функции)
  5. HTTParty часто является хорошим способом

Пример;

 class ClientBase
  # maybe we pass in a logger, or something
  def initialize(options={})
  end

  # perhaps a central way to call the api
  def call(method_name, *args)
  end
end

class GeonamesClient < ClientBase

  base_uri "www.geonames.org"

  def postal_codes(country)
    ...
  end
end
  

Затем вы создаете его экземпляр и вызываете его.
(возможно, что клиент может поддерживать некоторое состояние между вызовами)

 client = GeonamesClient.new(:logger => Address.logger)
client.countries.each do |country|
  client.postal_codes(country)
end