我们需要检查 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_id
在 params
中不可用,将引发 ActionController::ParameterMissing
错误,您的其余操作将无法完成。
如果需要,您可以在控制器规范中检查这一点:
it 'throws an error when :trainee_id is missing' do
expect { get :published, params: { }) }.to raise_error(ActionController::ParameterMissing)
end
我正在开发 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_id
在 params
中不可用,将引发 ActionController::ParameterMissing
错误,您的其余操作将无法完成。
如果需要,您可以在控制器规范中检查这一点:
it 'throws an error when :trainee_id is missing' do
expect { get :published, params: { }) }.to raise_error(ActionController::ParameterMissing)
end