Внедрение сторонних ресурсов API в пользовательское приложение rails

Я студент, изучающий веб-разработку в известном учебном лагере в Соединенных Штатах. Для моего завершающего проекта я решил попробовать создать довольно простое приложение, в котором один аутентифицированный пользователь может отправить некоторое количество биткойнов другому пользователю (я описал моему учителю как платформу для чаевых в бутылках). Хотя в теории это звучит просто, есть много моментов, в которых я боюсь споткнуться.

Я создаю это приложение с помощью рельсов, используя Coinbase API. В моей школе нас учили рельсам с достаточно строгой архитектурой MVC. Вот где я нашел свою первую проблему. Что касается ресурсов, то мы, по сути, строили с нуля; это будет моя первая попытка внедрить сторонний API на серверной части. Я заметил в документации Coinbase, что есть несколько четко определенных ресурсов, которые мне нужно использовать. Наиболее заметными ресурсами являются пользователи и учетные записи (я создал учетные записи как «профили», но они служат той же цели в ERD).

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

Любая помощь очень ценится!


person d00medman    schedule 03.06.2017    source источник


Ответы (1)


Я собираюсь использовать Stripe для примера, потому что их документы самые лучшие:

Внутри вашего приложения Rails у вас есть модель User. В этом примере у вашего пользователя есть id, email и stripe_customer_id.

user.rb:

before_create :create_stripe_customer

def create_stripe_customer
  stripe_customer = Stripe::Customer.create(
    :email => "[email protected]",
  ) 
  self.stripe_customer_id = stripe_customer.id
end

def stripe_customer
  @stripe_customer ||= Stripe::Customer.find(self.stripe_customer_id)
end 

Использование before_create против внешнего API не одобряется («что, если время ожидания или ошибки?»), но для того, чтобы узнать, что делать, это нормально.

Если вы спрашиваете: «Должен ли я реплицировать все данные в своей собственной базе данных?» ответ - нет; позвольте API выполнять работу, но кешируйте результаты и убедитесь, что вы не блокируете запросы своего приложения с помощью внешних запросов API.

person Josh Brody    schedule 03.06.2017
comment
Я думаю, что это становится немного яснее. Stripe::Customer.create обращается к ресурсу и использует его метод. Итак, если бы я хотел, чтобы мой пользователь создал кошелек, например, мне нужно было бы вызвать Coinbase::Wallet::Client.create_account. Честно говоря, я не уверен, что спрашивал о репликации данных в моей базе данных. Правильно ли я предполагаю, что результат вызова Stripe::Customer.create хранится в их базе данных, а не в моей собственной, и что я должен самостоятельно сохранять только необходимые для вызова их базы данных (что вы, по-видимому, и делаете в stripe_customer метод)? - person d00medman; 03.06.2017
comment
Именно это. Он отправляет данные на их сервер (через HTTP-запрос) для их сохранения. Позвольте вашему поставщику API (Coinbase, Reddit, Stripe) обрабатывать модели данных (не переопределяйте то, что они уже делают), в то время как вы обрабатываете бизнес-логику, поскольку она относится к вашему взаимодействию с их интерфейсом. - person Josh Brody; 03.06.2017
comment
Круто, у меня есть еще несколько разных опасений по поводу написания этого кода: 1.) Правильно ли я предполагаю, что при взаимодействии со сторонним API мне действительно не нужно прикасаться к контроллеру, так как большинство поднятие тяжестей осуществляется с моделью? 2.) У меня уже установлен Gem, но я не знаю, куда поместить оператор require. Моя интуиция подсказывает вне определения класса, в самом верху файла, но я далеко не уверен в этом. 3.) Должны ли модели, взаимодействующие с coinbase, происходить от ActiveRecord, или мне понадобится другой суперкласс? - person d00medman; 03.06.2017
comment
Пуристы скажут вам, что ваша логика принадлежит служебному объекту, но ради обучения можно поместить ее в любое место, где вы можете повторно использовать ее без необходимости копировать/вставлять/изменять (то есть, не контроллеры; модели отлично подходят для этого). ) RE: требуется — см. justinweiss.com/articles/how-does -rails-handle-gems Можно использовать ActiveRecord; если вы хотите проявить фантазию (и действительно понравиться пуристам), используйте PORO и соедините их с некоторыми докладчиками (которые также могут быть PORO); спускаться оттуда. - person Josh Brody; 03.06.2017
comment
Хорошо, это было очень полезно для меня. Я думаю, что нахожусь в хорошем положении, чтобы начать работу над своим проектом. Большое спасибо! - person d00medman; 03.06.2017