我正在尝试从具有如下 API 的第三方库中获取数据:https://foo.com/user.json?username=<USERNAME>
我不知道如何强制 ActiveResource 使用“user.json”而不是“users.json”。是否可以?
我让它与reactive_resources gem一起工作......有没有办法在纯ActiveResources中做到这一点?
最佳答案
class User < ActiveResource::Base
self.element_name = "user"
end
接下来,您将询问如何从 URL 中获取一个元素,该元素在 ActiveResource 中看起来是//foo.com/user.json 而不是//foo.com/user/.json
User.find(:one, :from => "https://foo.com/user.json?username=#{<USERNAME>}"
编辑以回应评论
有没有办法做到这一点,而不必每次我想使用 find() 时都输入请求的完整 URL?
一种方法是在类中定义一个方法来为您完成完整的 URL。
class User < ActiveResource::Base
self.element_name = "user"
def self.find_by_username(username)
find(:one, :from => "https://foo.com/user.json?username=#{username}"
end
def find
self.class.find(:one, :from => "https://foo.com/user.json?username=#{username}"
end
end
另一种方法是重新定义 element_path。
class User < ActiveResource::Base
self.element_name = "user"
def self.element_path(id, prefix_options = {}, options = {})
"https://foo.com/user.json?username=#{prefix_options["user_id"]}"
end
end
有些人称之为猴子补丁,有些人称之为面向对象编程。我说,当您进入代码或使用 Ruby 的动态特性来改 rebase 本行为时,这只是猴子修补,这是在面向对象编程中做事的一种完全合法的方式。然而,Ruby 社区很少使用 OOP,几乎忽略了继承,而支持更松散(并且表现不太好)的混合,并且只使用鸭子类型来实现多态性。
必须使用 ActiveResource 来构建 URL 的问题是,您无法重新定义 Web 服务以接受 ActiveResource 约定,这就是许多人改用 HTTParty 的原因。 “如果非要建网址,还不如用HTTParty。”
关于ruby-on-rails - ActiveResource 如何从具有单数名称的 REST API 中获取资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607833/