我正在尝试从具有如下 API 的第三方库中获取数据:
https://foo.com/user.json?username=<USERNAME>
我不知道如何强制 ActiveResource 使用“user.json”而不是“users.json”。是否可以?
我让它与reactive_resources gem一起工作......有没有办法在纯ActiveResources中做到这一点?
我正在尝试从具有如下 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 的动态特性来改变基本行为时,它只是猴子补丁,这是在面向对象编程中做事的一种完全合法的方式。然而,Ruby 社区并没有大量使用 OOP,几乎忽略了继承,而支持更松散(且表现不佳)的混入,并且仅使用鸭子类型来实现多态性。
不得不使用 ActiveResource 来构建一个无法重新定义 Web 服务以接受 ActiveResource 约定的 URL 的问题是许多人改用 HTTParty 的原因。“如果非要建URL,还不如用HTTParty。 ”
如果您只需要摆脱 URL 中的资源名称复数形式,请覆盖collection_name
:
class User < ActiveResource::Base
self.element_name = "user"
def self.collection_name
element_name
end
end