如何将代码重构为服务类

时间:2017-08-16 15:54:43

标签: ruby-on-rails json ruby

我的模型中有逻辑,我认为最适合服务类。它从API中获取电影列表。理想情况下,我希望此服务类执行相同操作并为数据库设定种子。目前,我在Movie.create_all_from_api文件中调用seeds.rb。我是Rails的新手,所以我想知道在哪里放置这个服务类以及我应该在哪里调用该服务。我把它放在/app/service文件夹中吗?

Movie.rb

class Movie < ApplicationRecord
   require 'rest_client'
   has_many :reviews

   def self.create_all_from_api
      moviedata = retrieve_results
      moviedata['results'].each do |m|
        Movie.create(title: m['title'], release: m['release_date'], genre: m['genre'])
      end
   end

   def self.get_data(url)
      RestClient.get(url, { :content_type => :json})
   end

   def self.retrieve_results
      url = "https://api.themoviedb.org/3/movie/popular?page=1&language=en-US&api_key=s0m3n1c3k3y"
      JSON.parse(get_data(url))
   end

end

我建议的服务类

class ApiService
   require 'rest_client'
   def self.create_all_from_api
      moviedata = retrieve_results
      moviedata['results'].each do |m|
         Movie.create(title: m['title'], release: m['release_date'], genre: m['genre'])
      end
   end

   def self.get_data(url)
      RestClient.get(url, { :content_type => :json})
   end

   def self.retrieve_results
      url = "https://api.themoviedb.org/3/movie/popular?page=1&language=en-US&api_key=s0m3n1c3k3y"
      JSON.parse(get_data(url))
   end
end

1 个答案:

答案 0 :(得分:0)

是的,您可以创建一个app/services/文件夹。

我对您的代码提出了一些意见(基于意见的大多数意见):

  • 服务类通常定义实例方法perform,因此您可以像这样使用它:RegisterUser.new(some, args).perform
  • 您当前的ApiService仅包含类方法,因此您不需要实例化该类。这是module的目的,它不能实例化,只是提供方法。
  • 我会在服务对象的网址中创建一个常量,例如URL = "https://api.themoviedb.org [...]".freeze,然后使用它。
  • 有几种方法可能是private
  • 类/模块名称应该是CreateUserSendWelcomeEmail等操作。您当前的服务对象可以命名为CreateMoviesFromJSONFeed