【问题标题】:call arbitrary chained methods on wrapper class在包装类上调用任意链式方法
【发布时间】:2015-06-17 18:04:33
【问题描述】:

我正在为 API 创建一个包装类,因为我的应用程序需要在不同时间使用不同的凭据调用它。我开始向包装器传递一个方法和参数,然后在调用它时(基本上)这样做

call
  set_credentials
  TheAPI::Thing.send(method, args)
ensure
  reset_credentials_to_default
end

但是,我意识到这里的挑战是我是否需要链接方法;这样我一次只能调用一个;所以例如我不能TheAPI::Thing.find(id).delete。 (至少,如果不重新调用凭据设置器,这是不可取的,因为我必须获取令牌)。

有没有办法使用 ruby​​ 来收集链接到对象上的方法/参数?还是我只需要传递一些丑陋的有序集合?

编辑:activerecord 的查询构建器肯定会做这样的事情,在返回之前收集链接的方法,然后在它们全部收集之后,确保作为最后一步构建、调用和返回查询?

【问题讨论】:

  • 没有“丑陋的有序集合”,您希望它如何确定操作顺序?我想您可以设置一个解析器,该解析器将优先于可能的方法的顺序,但是对于 API,将每个操作分开更有意义,因此您可以做的最好的事情是创建一个类似客户端的类,该类将保存凭据并允许最终用户通过那里提出其他请求。
  • 我想我的目标是看看我是否可以让像Wrapper.find(id).delete 这样的链中的方法被连续调用而不返回并调用我的确保块。或者,如果有一种我不知道的方法可以简单地解析在对象上调用的一系列方法(这没有多大意义,但只是想我会检查一下)。

标签: ruby-on-rails ruby wrapper


【解决方案1】:

这样做的方法是定义一个代理对象并传递它而不是实际的东西。

在对象本身中,持有对 Thing 的引用并覆盖 method_missing:http://ruby-doc.org/core-2.1.0/BasicObject.html#method-i-method_missing

在缺少的方法中做你今天正在做的事情。简而言之,这就是 ActiveRecord 正在做的事情。

就链接而言,我认为这不是问题,因为可以链接的方法通常会返回对 self 的引用。当您调用链中的第二个方法时,您实际上已经完成了第一个方法的工作,并且拥有一个具有链中第二个方法的对象。您需要注意的唯一技巧是,如果您希望链接成功,您希望返回对封装事物的代理类的引用,而不是实际返回事物。

试一试,如果遇到问题,请联系我,我可以创建一个完整的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2016-11-30
    • 2011-09-10
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多