【发布时间】:2015-12-11 15:37:43
【问题描述】:
在进行 API 调用时,是否有任何方法可以跳过操作的前置过滤器?
所以通常我希望在执行 API 调用时执行 before_filter x。
skip_before_filter :x, :except => API CALL BEING MADE
【问题讨论】:
标签: ruby-on-rails api skip before-filter
在进行 API 调用时,是否有任何方法可以跳过操作的前置过滤器?
所以通常我希望在执行 API 调用时执行 before_filter x。
skip_before_filter :x, :except => API CALL BEING MADE
【问题讨论】:
标签: ruby-on-rails api skip before-filter
这在一定程度上取决于您如何定义 API 调用。如果是 JSON 格式的任何请求,您可以执行以下操作:
skip_before_action :x if: -> { request.format.json? }
不过,这似乎不是一个理想的解决方案,最好为 Web 和 API 制作单独的控制器。您可以按照以下方式做一些事情:
class APIController < ApplicationController
# API-specific filters
end
class SomeOtherController < APIController
# your API actions
end
您也可以对 Web 执行相同的操作,然后配置您的路由以将请求发送到正确的控制器操作。
希望对您有所帮助。
【讨论】:
您可以在控制器中添加
skip_before_action :x, only: WHEN API CALL BEING MADE
我猜,你会想要 only 而不是 except
【讨论】:
这不是您问题的直接答案,但您希望 API 和 Web 请求的不同行为这一事实可能是一种气味,即您的 API 请求可以由单独的控制器处理(我确信存在差异在您发送的回复中)。代码可能会更干净,控制器内部的分支更少。您甚至可以让两个控制器都继承自“基本”控制器,该控制器执行常见查询以消除重复。
无论如何,except 和 only 只能接受控制器操作的名称,因此在您的回调方法中,您可以考虑在 request.headers["Content-Type"] == 'application/json 或 request.xhr? 上进行分支
【讨论】: