我正在开发一个 Rails + React Web 应用程序。并且有一个 GET 请求需要一个参数trainee_id
。
我的问题是:
是否需要添加params.require(:trainee_id)
和相对异常处理程序来验证参数是否存在?
路线:获取/结果/学员/:trainee_id/发布
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(:p arams) { { trainee_id: nil } } ),因为没有路由与此请求匹配。
你是对的,如果单个定义的路由是调用控制器操作的唯一方式,那么trainee_id
参数将始终存在。如果要验证这一点,可以编写一个路由规范,以验证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_id
在params
中不可用,这将引发ActionController::ParameterMissing
错误,并且其余操作将无法完成。
如果需要,可以在控制器规范中检查以下内容:
it 'throws an error when :trainee_id is missing' do
expect { get :published, params: { }) }.to raise_error(ActionController::ParameterMissing)
end