#ruby-on-rails
#ruby-on-rails
Вопрос:
Я пишу приложение rails, которое выполняет вызовы нескольким внешним веб-API, например Geonnames. Моя идея состоит в том, чтобы зафиксировать эту логику в отдельных модулях или классах и вызывать их из моих классов model и controller. Существуют ли какие-либо рекомендации по размещению такого кода? Должен ли это быть отдельный класс модели неактивной записи или модуль в папке lib? Или лучше просто реализовать вызовы WS как статические методы в классах ActiveRecord, где они мне нужны?
Спасибо
Ответ №1:
Есть несколько способов сделать это, но в целом я придерживаюсь следующих принципов.
- Они живут в
/lib
(если у вас их много, вы можете создать/lib/clients
вспомогательный каталог) - У них есть такие имена, как
GeonamesClient
илиGeonamesWrapper
- Это класс, который вы должны создать
- Они могут наследоваться от базового класса (или, возможно, смешивать некоторые базовые функции)
- 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