ruby-on-rails - ActiveResource 如何从具有单数名称的 REST API 中获取资源?

标签 ruby-on-rails api rest activeresource

我正在尝试从具有如下 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/

相关文章:

ruby-on-rails - 这可能在 Controller 测试中吗?

ruby-on-rails - 在 Rails 中,我们不能一起使用 send_file 和 redirect_to 吗?多次调用渲染和/或重定向错误

Python dir命令确定方法

api - 通过 REST API 的 Apple HealthKit 数据(2018 年更新)

c# - 单元测试asp.net mvc restful routing FormatResult

ruby-on-rails - 我应该在后端(Rails API)还是前端(React/Redux)上查询和过滤

ruby-on-rails - 无法自动加载常量 Api::V1::UsersController

javascript - Google Plus One Button - 如何添加回调?

ios - Swift 函数无法尝试从 rest 服务获取 JSON 数组并转换为 swift 对象

.net - 如何将 xsl 样式表节点添加到 XmlSerializer 生成的 XML?