我应该在哪里获取推文? (控制器,模型,助手......)

时间:2015-08-01 21:25:52

标签: ruby-on-rails ruby twitter

虽然有其他框架经验,但我是铁杆新手。我来the main twitter gem想要使用它。我理解代码......但是我根本不明白我应该在哪里工作(我已经阅读了很多 rails 但缺乏实际的例子)。

  1. 我想获取推文信息(帖子,用户等)
  2. 使用postgre将推文保存到数据库

    • 我有一个'出版物'(关于推文)和'出版'模型,帮助者等等。
  3. 有人可以告诉我如何做到这一点吗? 我不是要求你做我的工作。请通过一个懒惰的例子向我解释一下rails的思考过程,因为我不了解如何以这种方式使用gem ...非常感谢你的帮助:)

1 个答案:

答案 0 :(得分:1)

max's comment是完全正确的,但为了帮助将其置于上下文中,让我说明在您的情况下,您可以构建和应用服务对象。

首先,考虑一下您的服务对象将要做什么,并为其选择一个名称(稍后您会经常更改它,因为您可以更好地解决问题)。例如,TweetFetcher。然后,在它完成工作之前,确定它需要哪些信息。我不清楚你要从哪个推文获取,但是我们假设它只是想获取给定句柄的最新推文。然后,您的对象可以这样开始:

class TweetFetcher
  def initialize(handle)
    @handle = handle
  end
end

现在,这个文件可以在任何地方Rails自动加载它。 lib/文件夹非常标准(例如lib/tweet_fetcher.rb),但您可能需要将lib添加到自动加载路径。更简单的是把它扔进app/models文件夹,虽然这对未来的开发人员来说有点混乱。

接下来,让它完成它的工作。你需要在课堂上添加一个“调用”它的新方法;标准名称为call,但您可以选择自己喜欢的名称。此时,我建议您为服务对象编写测试,就像您对模型一样,但我不会详细介绍。在流程结束时,您的代码将如下所示:

class TweetFetcher
  def initialize(handle)
    @handle = handle
  end

  def call
    # not real code at all
    tweet = Twitter::Client.fetch_latest_tweet(@handle)
    Publication.create!(tweet_id: tweet.id)
  end
end

岩石固体。那么,接下来的问题是,什么时候打电话呢?一般来说,我建议从控制器调用服务对象。例如,假设当用户将刚刚输入推文的表单提交到... POST /publications,其中PublicationsController#create点击时,就会发生这种情况:

class PublicationsController < ApplicationController
  def create
    # validate params, w/e
    @publication = TweetFetcher.new(params[:handle]).call
    flash[:notice] = "aaaand done."
  end
end

但是,您可以从任何地方调用您的服务对象 - 这就是构建它们的美妙之处。它允许您在任何上下文中提取,封装和重用代码。正如我认为你会发现的那样,这也使我们更容易测试你的代码。希望这有帮助,祝你好运!