我有几种方法的控制器。我希望能够为某些路线要求某些参数。
我希望my_endpoint_1
不需要任何参数,但是希望my_endpoint_2
如果不包含myId
参数,则返回类似400错误的信息。
class MyController < ApplicationController
def my_endpoint_1
do_something
end
def my_endpoint_2
id = params[:myId]
do_something_with id
end
end
在我的my_endpoint_2
中配置了routes.rb
的路由:
get 'mycontroller/my_endpoint_2/:myId'
答案 0 :(得分:1)
如果未提供myId
参数,则该路线将不匹配,因此在生产中,rails将返回404 NOT FOUND。
因此,终点已经需要该参数。但是,两个端点都允许提供任意参数(例如,通过mycontroller/my_endpoint_2/5?my_param=5
),但是由于它们将被忽略,因此这不会造成问题。但是正如您在这种情况下专门询问错误消息时,可以采用以下一种方法:
class MyController < ApplicationController
def my_endpoint_1
return if render_400_on_wrong_params
do_something
end
def my_endpoint_2
return if render_400_on_wrong_params(:myId)
id = params[:myId]
do_something_with id
end
private
def render_400_on_wrong_params(allowed = nil)
unsolicited_params = params.keys - Array(allowed)
if unsolicited_params.any?
render plain: "Unsolicited params: #{unsolicited_params.join(', ')}", status: 400
end
end
end
将其提取到before_action中也很有意义,但是功能将基本保持不变。
答案 1 :(得分:0)
您可以在参数上调用require
params.require(:myId)
如果缺少参数,它将引发ActionController::ParameterMissing
异常。
https://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require
然后您可以像这样在ApplicationController上抢救该异常:
rescue_from 'ActionController::ParameterMissing' do |exception|
render plain: '', status: 400
end
https://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html