我正在尝试从具有以下API的第三方库中获取数据:
https://foo.com/user.json?username=<USERNAME>
我无法弄清楚如何强制ActiveResource使用“user.json”而不是“users.json”。有可能吗?
我使用了reactive_resources gem ...有没有办法在纯粹的ActiveResources中做到这一点?
答案 0 :(得分:8)
class User < ActiveResource::Base
self.element_name = "user"
end
接下来,您将询问如何从名为ActiveResource的URL中获取一个元素为//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,几乎忽略了继承而支持更松散(和表现不太好)的混合,并且只使用duck-typing来实现多态性。
不得不使用ActiveResource来构建一个URL而无法重新定义Web服务以接受ActiveResource约定的问题是许多人使用HTTParty的原因。 “如果你必须构建URL,也可以使用HTTParty。”
答案 1 :(得分:4)
如果您只需要删除网址中的资源名称复数,请覆盖collection_name
:
class User < ActiveResource::Base
self.element_name = "user"
def self.collection_name
element_name
end
end