在 HALT 不可用的 class 内部,我应该如何 return Sinatra HTTP 错误?
How should I return Sinatra HTTP errors from inside a class where HALT is not available?
我的本机应用程序有一个大型后端 API,它是在 Sinatra 中构建的,它还提供一些管理网页。我正在尝试整理代码库并将代码重构为 lib 目录中的 classes。
我的 API 客户需要状态和消息,例如 200 OK 或 404 未找到配置文件。我通常会用 halt 404, 'Profile Not Found'
.
之类的东西来做到这一点
halt
使用 HTTP 状态代码和来自 class 内部消息的最简单方法是什么?
旧湿代码
post '/api/process_something'
halt 403, 'missing profile_id' unless params[:profile_id].present?
halt 404, 'offer not found' unless params[:offer_id].present?
do_some_processing
200
end
新干码
post '/api/process_something'
offer_manager = OfferManager.new
offer_manager.process_offer(params: params)
end
offer_manager.rb
class OfferManager
def process_offer(params:)
# halt 403, 'missing profile_id' unless params[:profile_id].present?
# halt 404, 'offer not found' unless params[:offer_id].present?
# halt doesn't work from in here
do_some_processing
200
end
end
这个问题对于 CodeReview 来说可能更好,但是您可以在此处的 OO 设计中看到的一种方法是 'halt' 路径和 'happy' 路径。您的 class 只需要实施一些方法来帮助这在您所有的 sinatra 路由和方法中保持一致。
这是一种方法,使用继承可以很容易地在其他 class 中采用这种接口。
post '/api/process_something' do
offer_manager = OfferManager.new(params)
# error guard clause
halt offer_manager.status, offer_manager.halt_message if offer_manager.halt?
# validations met, continue to process
offer_manager.process_offer
# return back 200
offer_manager.status
end
class OfferManager
attr_reader :status, :params, :halt_message
def initialize(params)
@params = params
validate_params
end
def process_offer
do_some_processing
end
def halt?
# right now we just know missing params is one error to halt on but this is where
# you could implement more business logic if need be
missing_params?
end
private
def validate_params
if missing_params?
@status = 404
@halt_message = "missing #{missing_keys.join(", ")} key(s)"
else
@status = 200
end
end
def do_some_processing
# go do other processing
end
def missing_params?
missing_keys.size > 0
end
def missing_keys
expected_keys = [:profile_id, :offer_id]
params.select { |k, _| !expected_keys.has_key?(k) }
end
end
我的本机应用程序有一个大型后端 API,它是在 Sinatra 中构建的,它还提供一些管理网页。我正在尝试整理代码库并将代码重构为 lib 目录中的 classes。
我的 API 客户需要状态和消息,例如 200 OK 或 404 未找到配置文件。我通常会用 halt 404, 'Profile Not Found'
.
halt
使用 HTTP 状态代码和来自 class 内部消息的最简单方法是什么?
旧湿代码
post '/api/process_something'
halt 403, 'missing profile_id' unless params[:profile_id].present?
halt 404, 'offer not found' unless params[:offer_id].present?
do_some_processing
200
end
新干码
post '/api/process_something'
offer_manager = OfferManager.new
offer_manager.process_offer(params: params)
end
offer_manager.rb
class OfferManager
def process_offer(params:)
# halt 403, 'missing profile_id' unless params[:profile_id].present?
# halt 404, 'offer not found' unless params[:offer_id].present?
# halt doesn't work from in here
do_some_processing
200
end
end
这个问题对于 CodeReview 来说可能更好,但是您可以在此处的 OO 设计中看到的一种方法是 'halt' 路径和 'happy' 路径。您的 class 只需要实施一些方法来帮助这在您所有的 sinatra 路由和方法中保持一致。
这是一种方法,使用继承可以很容易地在其他 class 中采用这种接口。
post '/api/process_something' do
offer_manager = OfferManager.new(params)
# error guard clause
halt offer_manager.status, offer_manager.halt_message if offer_manager.halt?
# validations met, continue to process
offer_manager.process_offer
# return back 200
offer_manager.status
end
class OfferManager
attr_reader :status, :params, :halt_message
def initialize(params)
@params = params
validate_params
end
def process_offer
do_some_processing
end
def halt?
# right now we just know missing params is one error to halt on but this is where
# you could implement more business logic if need be
missing_params?
end
private
def validate_params
if missing_params?
@status = 404
@halt_message = "missing #{missing_keys.join(", ")} key(s)"
else
@status = 200
end
end
def do_some_processing
# go do other processing
end
def missing_params?
missing_keys.size > 0
end
def missing_keys
expected_keys = [:profile_id, :offer_id]
params.select { |k, _| !expected_keys.has_key?(k) }
end
end