我到底应该从哪里获取tweet ?(控制器、模型、帮助器等)



虽然有其他框架的经验,但我是一个rails新手。我遇到了twitter的主要宝石,想要使用它。我懂代码…但我不明白我应该在哪里工作,在所有(我读过很多rails,但缺乏实际的例子)。

  1. 我想获取tweet信息(post, user, etc)
  2. 使用postgre将tweet保存到数据库

    • 我有一个"发布"(关于推文)和"发布"模型,在助手中等等。
谁能告诉我怎么做这件事?我不是要你做我的工作。请通过一个懒惰的例子向我解释rails的思维过程,因为我不明白如何以这种方式使用gem…非常感谢您的帮助

max的评论是完全正确的,但是为了帮助把它放在上下文中,让我说明一下,在您的情况下,您可以如何构建和应用服务对象。

首先,考虑您的服务对象将要做什么,并为它选择一个名称(您以后经常会更改这个名称,因为您会更好地了解事情)。例如: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

可靠。那么,下一个问题是,何时调用它?一般来说,我建议从控制器调用服务对象。例如,假设这一切都应该发生在用户提交表单时,他们刚刚输入了twitter句柄…例如,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

但是,您可以从任何地方调用服务对象——这就是构建它们的美妙之处。它允许您在任何上下文中提取、封装和重用代码。它还使测试代码变得更容易,我想你会发现这一点。希望这对你有所帮助,祝你好运!

最新更新