gpt4 book ai didi

ruby-on-rails - 如何将代码重构为服务类

转载 作者:太空宇宙 更新时间:2023-11-03 16:41:58 24 4
gpt4 key购买 nike

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

电影.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

最佳答案

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

我对您的代码有一些评论(大多数基于意见):

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

关于ruby-on-rails - 如何将代码重构为服务类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45718142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com