Если параметр myId
не указан, маршрут не будет совпадать, и поэтому рельсы вернут 404 НЕ НАЙДЕНО в процессе производства.
Таким образом, конечная точка уже требует этот параметр.Однако обе конечные точки позволяют указывать произвольные параметры (например, через 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 , но функциональностьостанется в основном таким же.