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

Log*_*man 8 api rest ruby-on-rails activeresource

我试图从具有以下API的第三方库中获取数据:

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

我无法弄清楚如何强制ActiveResource使用"user.json"而不是"users.json".可能吗?

我使用了reactive_resources gem ...有没有办法在纯粹的ActiveResources中做到这一点?

Mar*_*rce 8

class User < ActiveResource::Base
  self.element_name = "user"
end
Run Code Online (Sandbox Code Playgroud)

接下来,你要问的是如何从看起来的ActiveResource被//foo.com/user.json代替//foo.com/user/.json的URL得到一个元素

User.find(:one, :from => "https://foo.com/user.json?username=#{<USERNAME>}"
Run Code Online (Sandbox Code Playgroud)

编辑以回应评论

有没有办法这样做,而不必每次我想使用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
Run Code Online (Sandbox Code Playgroud)

另一种方法是重新定义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
Run Code Online (Sandbox Code Playgroud)

有些人称之为猴子修补,其他人称之为面向对象编程.我说这是只猴子修补你什么时候到的代码或使用Ruby的动态性质改变基本行为,这是做在面向对象编程的东西是完全合法的方式.但是,Ruby社区不使用OOP多,几乎忽略赞成要宽松得多(少很乖)的继承混合插件,并且只用鸭打字的多态性.

不得不乱用ActiveResource来构建一个URL,你无法重新定义Web服务以接受ActiveResource约定,这就是为什么许多人使用HTTParty的原因." 如果你必须构建URL,也可以使用HTTParty. "


ign*_*eus 5

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

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

  def self.collection_name
    element_name
  end
end
Run Code Online (Sandbox Code Playgroud)