# users_show_controller.rb
class Controllers::Users::Show
include Hanami::Action
params do
required(:id).filled(:str?)
end
def call(params)
result = users_show_interactor(id: params[:id])
halt 404 if result.failure?
@user = result.user
end
end
# users_show_interactor.rb
class Users::Show::Interactor
include Hanami::Interactor
expose :user
def call(:id)
@user = UserRepository.find_by(:id)
end
end
我有一个控制器和一个像上面这样的交互器。我正在考虑在控制器上区分 ClientError 和 ServerError 的更好方法。
我认为如果我能处理如下错误,那就太好了。
handle_exeption StandardError => :some_handler
但是,hanami-interactor 包装了自身内部引发的错误,因此控制器通过来自交互器的结果对象接收错误。
我不认为在控制器上重新引发错误是个好方法。
result = some_interactor.call(params)
raise result.error if result.failure
像这样实现错误处理程序怎么样?我知道if
语句会很容易增加,所以这种方式并不聪明。
def call(params)
result = some_interactor.call(params)
handle_error(result.error) if result.faulure?
end
private
def handle_error(error)
return handle_client_error(error) if error.is_a?(ClientError)
return server_error(error) if error.is_a?(ServerError)
end