1

我正在寻找从其他网站获取数据的代码的“rails”设计模式。

我的应用程序中有一个 rails 控制器,它不是从数据库中获取数据,而是从外部 API 或从网络上抓取数据。

放置此代码的“rails”位置在哪里。

为了快速实现,我只是将它放在模型中,但模型不与数据库交互 - 或不支持标准模型功能 - 所以感觉不对,但我对 rails 和 ruby​​ 的理解还不够扎实,无法知道在哪里它应该去。

代码的大致工作方式是控制器调用 model.fetchData args 模型使用 HTTParty 或类似方法来使调用处理数据将其传递回控制器

有什么建议吗?

4

1 回答 1

1

从广义上讲,我认为有两种可能的方法可以做到这一点:

  1. 创建一个普通的 ruby​​ 类来包含向 API 发出请求和处理来自它的响应的方法。您可以在此类中包含 HTTParty 模块,其中包含include HTTParty. 放置此代码的通常位置在 lib/ 中(确保无论您放置它,路径都在autoload_paths中)。
  2. 如果您正在做任何非常复杂的事情,或者 API 本身很复杂,您可能需要考虑创建一个单独的 gem 来处理与 API 的交互。这种类型的 gem 的术语是“API 包装器”——如果你环顾四周,你会发现那里有很多流行服务(Twitter、LinkedIn、Flickr 等)。

注意我没有提到活动记录。如果您不打算将任何内容保存到数据库中,我认为甚至不需要创建任何 activerecord 模型。您可以只使用控制器和视图,然后(如果需要)从 activemodel(验证、国际化等)中挑选和选择组件,以使您的 ruby​​ API 包装类感觉更像 Rails 模型。例如,我在我正在开发的应用程序中所做的一件事是在实际向外部 API 发出请求之前对查询字符串应用验证,这有点像在查询数据库之前对数据库查询运行验证。请参阅Yehuda Katz 的这篇文章,了解更多关于如何让普通的 ruby​​ 对象感觉像 activerecord 模型的信息。

希望有帮助。我昨天回答了另一个与这个问题非常相似的问题,您可能也想看看这个答案:Using rails to consume web services/apis

于 2012-10-30T14:46:07.803 回答