ruby-on-rails - Rails - 如何为某些控制器方法自定义所需的参数?
问题描述
我有一个带有几种方法的控制器。我希望能够为某些路线要求某些参数。
我my_endpoint_1
不想需要任何参数,而是在不包含参数my_endpoint_2
时返回类似 400 的错误myId
。
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'
解决方案
如果myId
未提供参数,则路线将不匹配,因此 rails 在生产时将返回 404 NOT FOUND。
因此,端点已经需要该参数。但是,两个端点都允许提供任意参数(例如 via 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中也是有意义的,但功能将基本保持不变。