虽然有其他框架的经验,但我是一个rails新手。我遇到了twitter的主要宝石,想要使用它。我懂代码…但我不明白我应该在哪里工作,在所有(我读过很多rails,但缺乏实际的例子)。
- 我想获取tweet信息(post, user, etc)
-
使用postgre将tweet保存到数据库
- 我有一个"发布"(关于推文)和"发布"模型,在助手中等等。
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
但是,您可以从任何地方调用服务对象——这就是构建它们的美妙之处。它允许您在任何上下文中提取、封装和重用代码。它还使测试代码变得更容易,我想你会发现这一点。希望这对你有所帮助,祝你好运!