iel*_*anr 10 validation error-handling soa ruby-on-rails interface
我在Rails中创建了一个服务对象,作为我们的应用程序和API之间的接口.
我从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
Run Code Online (Sandbox Code Playgroud)
是否有任何良好的模式来处理验证和/或抛出Service对象的错误?
验证:
对于错误:
如果您知道任何好的模式,或者您有更好的想法来连接API,请告诉我.
Rob*_*ard 14
对于简单的情况(例如,只有一个参数),那么使用ArgumentError进行检查和提升就可以了.一旦你开始有复杂的情况(多个参数,对象等),我就开始依赖Virtus和ActiveModel Validations.
您链接的文章实际上提到了这些(请参阅"提取表单对象").我有时会使用类似这样的东西构建服务对象,例如.
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" }
Run Code Online (Sandbox Code Playgroud)
就异常而言,我会将它们保留为较小的操作(如此服务类).如果我正在编写更实质的内容,我会将它们包装起来,例如整个API客户端库.
我永远不会只返回零.诸如网络错误或来自服务器的错误或不可解析的响应之类的事情都受益于显式错误.
最后,有一个更重的方法叫做use_case.即使您不使用它,它也有很多关于如何处理您可能感兴趣的服务对象,验证和结果的想法.
编辑:另外,检查突变.像use_case一样,除了更简单,更不全面.
归档时间: |
|
查看次数: |
4094 次 |
最近记录: |