9

我正在尝试从具有如下 API 的第三方库中获取数据:

https://foo.com/user.json?username=<USERNAME>

我不知道如何强制 ActiveResource 使用“user.json”而不是“users.json”。是否可以?

我让它与reactive_resources gem一起工作......有没有办法在纯ActiveResources中做到这一点?

4

2 回答 2

9
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。

于 2012-09-26T18:25:01.627 回答
5

如果您只需要摆脱 URL 中的资源名称复数形式,请覆盖collection_name

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

  def self.collection_name
    element_name
  end
end
于 2016-04-25T18:58:04.690 回答