Ruby on rails 如何捕获Rails中的500内部服务器错误

Ruby on rails 如何捕获Rails中的500内部服务器错误,ruby-on-rails,api,Ruby On Rails,Api,我以前在从数据库中获取东西时做过很多次 对于我的具体情况,我使用连接到一块硬件。。。无论如何,在出现错误的情况下,例如无效id显然,我们希望引发异常或救援。。。但不幸的是,我不知道如何提高它,因为当它被击中时,已经太晚了(我想) 这里 # # getting params and saving item above... # if item.save device = RubySpark::Device.new("FAKEUNITID800") device.function("r

我以前在从数据库中获取东西时做过很多次

对于我的具体情况,我使用连接到一块硬件。。。无论如何,在出现错误的情况下,例如无效id显然,我们希望引发异常或救援。。。但不幸的是,我不知道如何提高它,因为当它被击中时,已经太晚了(我想)

这里

# 
# getting params and saving item above...
# 

if item.save
  device = RubySpark::Device.new("FAKEUNITID800")
  device.function("req", "ITEM")
  redirect_to controller: 'items', action: 'edit_items'
end
如果这是一个有效的ID,那么一切都将正常工作,它将带您进入
/edit
页面!但问题是,如果ID无效,它只会

Completed 500 Internal Server Error in 897ms

RubySpark::Device::ApiError - Permission Denied: Invalid Device ID:
我查阅了以下教程


但老实说,他们只是让我更困惑。也许我的方法不对。我一直认为,首先你提出请求,然后你有一个后备案例,这取决于你得到的状态(即200500404)。。。从这里开始。

Rails返回一个500内部服务器错误响应,因为引发了一个异常,它不知道如何处理。您无法挽救Rails中的“500 Internal Server Error”,因为它不是一个异常——它是框架从未捕获的异常中退出以避免数据丢失或不可预测的行为

幸运的是,你不必这么做。您只需营救
RubySpark
异常:

begin
  device = RubySpark::Device.new("FAKEUNITID800")
  device.function("req", "ITEM")
rescue RubySpark::Device::ApiError => e
  logger.error(e.message)
end
您还可以在Rails控制器中使用,将整个操作包装在
before
块中:

class FooController < ApplicationCotnroller
  rescue_from RubySpark::Device::ApiError, with: :do_something
  # ...
end
class FooController
你不能把
RubySpark::Device
调用包装成一个
begin
rescue
块并处理
apierro
异常吗?你可能想先读一下Ruby中异常是如何工作的,因为你的问题看起来很困惑。动态错误页面服务于一个非常不同的目的,更多的是为了虚荣而不是处理实际的错误。谢谢你,这正是我要找的!