ActiveResource如何从具有单个名称的REST API中获取资源?

问题描述:

我想从有看起来像一个API第三方库获取数据:ActiveResource如何从具有单个名称的REST 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 

接下来,你要问的是如何从看起来的ActiveResource被//foo.com/user.json代替//foo.com/user/.json

的URL得到一个元素
User.find(:one, :from => "https://foo.com/user.json?username=#{<USERNAME>}" 

编辑回应评论

有没有办法做到这一点,而无需输入请求的完整URL每一次我想用find()方法?

一种方法是在类中定义一个方法来为您完成完整的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代替。 “如果你要建立的网址,还不如用HTTParty

+0

有什么办法要做到这一点,而不必输入每一次我想使用find()的请求的完整URL? –

+0

你问了。回答编辑。 –

+1

你也可以使用'site'和'prefix'来组成URL的第一部分。 – funwhilelost

如果您只需要在URL摆脱资源名称多元化的,覆盖collection_name

class User < ActiveResource::Base 
    self.element_name = "user" 

    def self.collection_name 
    element_name 
    end 
end