Rails 5:如何在Rescue中声明HEAD 200

Rails 5: How to declare HEAD 200 in Rescue

我有一个 webhook 发送到我的应用程序的页面,我在处理数据时发现 SOAP 错误,但我想向 webhook 发送一个 200 状态。这在控制器中可能吗?

控制器

def example_method

  ...

rescue Savon::SOAPFault => error

  ...
  
  # Respond to the HTTP POST request by giving the 'all clear'
  head 200

  raise

end

首先不要将 soap 调用直接放入您的控制器 - 而是创建一个客户端 class 或 service object 来处理它。

你的控制器应该只真正知道它调用某种服务并且它可能会失败或成功 - 如果你在你的控制器中捕获特定于库的错误,你就会陷入困境。

那么如何在控制器中挽救异常?

您可以在线拯救他们:

class SomethingController

  def do_something

    begin
      # Something.this_may_blow_up!
    rescue SomeError => error
      head :ok and return
    end
  end
end

这里的关键是and return,它会停止控制器流程并防止双重渲染错误。

另一种方法是使用 rescue_from

class ThingsController

  rescue_from ActiveRecord::RecordNotFound do
    render :not_found and return
  end

  def show
    @thing = Thing.find(params[:id])
  end
end

以上是如何为每个控制器创建自定义 404 页面的示例。发生的事情是,当控制器上的操作被调用时,它被包装在一个 begin..rescue 块中,该块在控制器中查找 rescue_from 处理程序。