在不允许 ID 的情况下测试 PUT 的控制器规格
Testing controller specs for PUT without permitting ID
我有一个 RESTfully 更新模型的控制器。操作如下所示:
def update
@user = User.find(params[:id])
params['skill_list'] = params['skill_list'].join(',') if params['skill_list'].present?
@user.update!(user_params)
render nothing: true
end
def user_params
params.permit(:id, :summary, :skill_list)
end
我的规格如下:
it "should return 200 if param is for user put is summary" do
ActionController::Parameters.action_on_unpermitted_parameters = :raise
put :update, id: @bob.id, summary: 'yadayada', skill_list: ['a','b']
assert_response 200
end
现在流程如下
- 我们需要将
id
放在 put
规范中,以便告诉它在更新时使用哪个 id
。
- 控制器找到它并更新
summary
和 skill_list
字段。
- 但是,它也会覆盖
id
。
- 如果我不允许
id
,测试失败 ActionController::UnpermittedParams
- 如果我允许,实际的
id
会被替换(我们使用 friendly_id
gem 所以这是不需要的 - 数字 ID 将被 slug 替换,呈现用户无法使用。
目前我们禁止 id
并将规范置于待定状态 - 但在这些情况下最佳实践是什么?
提前致谢!
Patient: it hurts when I update my ID column!
Doctor: well then stop doing that.
从允许的参数列表中删除 "id"。它不属于那里。
更新模型:
@user.update!(user_params)
更新 ID 列,因为 user_params
包含一个 id
键。停止这样做:
@user.update!(user_params.except("id"))
我有一个 RESTfully 更新模型的控制器。操作如下所示:
def update
@user = User.find(params[:id])
params['skill_list'] = params['skill_list'].join(',') if params['skill_list'].present?
@user.update!(user_params)
render nothing: true
end
def user_params
params.permit(:id, :summary, :skill_list)
end
我的规格如下:
it "should return 200 if param is for user put is summary" do
ActionController::Parameters.action_on_unpermitted_parameters = :raise
put :update, id: @bob.id, summary: 'yadayada', skill_list: ['a','b']
assert_response 200
end
现在流程如下
- 我们需要将
id
放在put
规范中,以便告诉它在更新时使用哪个id
。 - 控制器找到它并更新
summary
和skill_list
字段。 - 但是,它也会覆盖
id
。 - 如果我不允许
id
,测试失败ActionController::UnpermittedParams
- 如果我允许,实际的
id
会被替换(我们使用friendly_id
gem 所以这是不需要的 - 数字 ID 将被 slug 替换,呈现用户无法使用。
目前我们禁止 id
并将规范置于待定状态 - 但在这些情况下最佳实践是什么?
提前致谢!
Patient: it hurts when I update my ID column!
Doctor: well then stop doing that.
从允许的参数列表中删除 "id"。它不属于那里。
更新模型:
@user.update!(user_params)
更新 ID 列,因为 user_params
包含一个 id
键。停止这样做:
@user.update!(user_params.except("id"))