虽然有其他框架经验,但我是铁杆新手。我来the main twitter gem想要使用它。我理解代码......但是我根本不明白我应该在哪里工作(我已经阅读了很多 rails 但缺乏实际的例子)。
使用postgre将推文保存到数据库
有人可以告诉我如何做到这一点吗? 我不是要求你做我的工作。请通过一个懒惰的例子向我解释一下rails的思考过程,因为我不了解如何以这种方式使用gem ...非常感谢你的帮助:)
答案 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
但是,您可以从任何地方调用您的服务对象 - 这就是构建它们的美妙之处。它允许您在任何上下文中提取,封装和重用代码。正如我认为你会发现的那样,这也使我们更容易测试你的代码。希望这有帮助,祝你好运!