我正在练习使用rest-client gem进行第三方api调用。现在,我用于调用第三方api的代码存储show
在my的方法中search_controller.rb
。我假设最好将逻辑存储在控制器之外的其他位置,以遵循在Ruby上的“瘦控制器”实践。在哪里放置这种类型的逻辑会更好,还是在这里放置它是个好地方?
我会说两种不同的对象。
这些类仅执行HTTP调用并触及应用程序边界。要将其隔离在离散对象中的原因是,它允许您在测试中对其进行模拟。它还使职责明确。
# adapted from the HTTParty readme
class StackExchangeClient
include HTTParty
base_uri 'api.stackexchange.com'
def initialize(service, page)
@options = { query: { site: service, page: page } }
end
def questions
self.class.get("/2.2/questions")
end
def users
self.class.get("/2.2/users")
end
end
/lib
这是一个存储客户端的好地方,因为它们很少包含特定于应用程序的逻辑。
服务对象是普通的旧式Ruby对象(PORO),旨在在您的域逻辑中执行一个单独的操作并很好地执行。
- Rails的服务对象:一个综合指南
class QuestionImporterService
def initialize(service, page, client: nil)
@client = client || StackExchangeClient.new(service, page)
end
def call
questions = @client.get_questions
questions.map do |attributes|
Question.new(attributes)
end
end
end
本示例使用构造函数注入来允许您模拟HTTP调用以进行测试。
您可以在中放置服务/app/services
。有时,Spring会“卡住”,并且不会在新文件夹中/app
自动加载文件,在这种情况下,您可以通过调用重启它$ spring stop
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句