gpt4 book ai didi

ruby-on-rails - 服务对象的验证和错误处理

转载 作者:行者123 更新时间:2023-12-04 03:28:39 25 4
gpt4 key购买 nike

我在 Rails 中创建了一个服务对象,作为我们的应用程序和 API 之间的接口(interface)。

我从 http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/ 得到这个想法

这是一个小例子:

class PackagesService
def self.get_package(package_id)
raise ArgumentError.new("package_id can't be nil") if package_id.blank?
package = API::get "/packages/#{package_id}"
package = JSON.parse package,
:symbolize_names => true unless package.blank?

end
end

是否有任何好的模式来处理服务对象的验证和/或抛出错误?

对于验证:
  • 我必须检查所有输入是否为 nil 或错误类型。有什么方法可以轻松验证吗?也许是铁路延伸?

  • 对于错误:
  • 我可以捕获所有 API 错误,然后安全地返回 nil。但是使用服务对象的程序员可能不知道 nil 的含义。
  • 我可以捕获 API 错误并引发另一个错误,这意味着在所有函数中都需要付出额外的努力
  • 第三个选项是保持原样,让程序员处理来自 API 的所有错误。

  • 如果您知道任何好的模式或者您是否有更好的想法来接口(interface) API,请告诉我。

    最佳答案

    对于简单的情况(例如,只有一个参数),那么您使用 ArgumentError 进行检查并加注就可以了。一旦你开始遇到复杂的情况(多个参数、对象等),我就开始依赖 VirtusActiveModel Validations .

    Your linked article实际上提到了这些(参见“提取表单对象”)。我有时会使用类似的东西来构造服务对象,例如。

    require 'active_model'
    require 'virtus'

    class CreatePackage
    include Virtus
    include ActiveModel::Validations

    attribute :name, String
    attribute :author, String
    validates_presence_of :name, :author

    def create
    raise ArgumentError.new("Invalid package") unless self.valid?
    response = JSON.parse(
    API::post("/packages", self.attributes),
    :symbolize_names => true
    )
    Package.new(response)
    end
    end

    class Package
    include Virtus
    attribute :id, Integer
    attribute :name, String
    attribute :author, String
    end

    # eg.
    service = CreatePackage.new(
    :name => "Tim's Tams",
    :author => "Tim",
    )
    service.valid? # true; if false, see service.errors
    package = service.create

    package.attributes
    # => { :id => 123, :name => "Tim's Tams", :author => "Tim" }

    就异常(exception)而言,我会将它们保留原样用于较小的操作(例如此服务类)。我 但是,如果我正在编写更实质性的东西,例如整个 API 客户端库,请将它们包装起来。

    我永远不会只返回零。诸如网络错误或来自服务器的错误或无法解析的响应之类的事情都受益于显式错误。

    最后,还有一种更重的方法,称为 use_case。 .即使您不使用它,它也有很多关于如何处理您可能会感兴趣的服务对象、验证和结果的想法。

    编辑 : 另外,请查看 Mutations .与 use_case 类似,只是更简单且不够全面。

    关于ruby-on-rails - 服务对象的验证和错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225809/

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