我们需要检查 Rails get 请求中是否缺少参数吗?

Do we need to check whether parameter is missing in Rails get request?

我正在开发 Rails + React 网络应用程序。还有一个 GET 请求需要一个参数 trainee_id.

我的问题是:

我是否需要添加 params.require(:trainee_id) 和相关的异常处理程序来验证参数的存在?

路线: 获取/results/trainees/:trainee_id/published

def get_trainee_published_result
 result = Result.find_by(user_id: params[:trainee_id])
 ...
 do stuff
 ...
end

不检查就用这个参数感觉不爽。但是,似乎如果缺少参数,路由将无效,甚至不会触发此 get_trainee_published_result 操作。

如果我在代码中包含 params.require(:trainee_id),Rspec 测试也会出现一些问题。我无法测试缺少参数的情况 (let(:params) { { trainee_id: nil } } ) 因为没有路由会匹配此请求。

你是对的,如果单个定义的路由是调用控制器操作的唯一方式,那么 trainee_id 参数将始终存在。如果你想验证这一点,你可以编写一个 routing spec 来验证 GET /results/trainees/:trainee_id/published 使用给定的参数调用你的操作:

expect(get: '/results/trainees/123/published')
  .to route_to(controller: 'trainees', action: 'published', trainee_id: '123')

至于您的操作本身,我会考虑通过 params.fetch(:trainee_id) 访问它来表示您希望 trainee_id 始终存在。如果出于任何原因,trainee_idparams 中不可用,将引发 ActionController::ParameterMissing 错误,您的其余操作将无法完成。

如果需要,您可以在控制器规范中检查这一点:

it 'throws an error when :trainee_id is missing' do
  expect { get :published, params: { }) }.to raise_error(ActionController::ParameterMissing)
end