【问题标题】:How to update a boolean attribute in Rails using a patch request如何使用补丁请求更新 Rails 中的布尔属性
【发布时间】:2020-12-21 23:04:15
【问题描述】:

我有一个布尔属性,我正在尝试使用 Rails 中的 Minitest 进行测试。这是有问题的测试:

test "admins can change a user's board member status" do
    patch user_path(@member, as: @admin), params: { user: { board_member: true } }
    assert_redirected_to(user_path(@member))
    assert_equal "Profile was successfully updated.", flash[:notice]
    assert_equal true, @member.board_member
end

我不明白为什么这不起作用。我可以在我的装置、数据库种子、浏览器中手动设置board_member 属性为true,也可以在Capybara 的系统测试中设置。

我尝试使用to_json 设置将用户参数传递给补丁请求,但这也不起作用。我不断收到与布尔属性未切换为 true 相同的错误:

 test_admins_can_change_a_user's_board_member_status#UsersControllerTest (1.28s)
   Expected: true
   Actual: false

这是我在用户控制器中将我的参数列入白名单的方式:

def user_params
   # List of common params
   list_params_allowed = [:email, :profile_photo, :first_name, :last_name, :title, :organization, :street, :city, :state, :zip_code, :phone]
   # Add the params only for admin
   list_params_allowed += [:role, :board_member] if current_user.admin?

   params.require(:user).permit(list_params_allowed)
end

同样,这在浏览器中按预期工作,但我想测试参数以确保在您尝试通过 url 提交“board_member”属性时不存在安全漏洞。

【问题讨论】:

    标签: ruby-on-rails testing tdd minitest


    【解决方案1】:

    您需要重新加载@member,以便它反映您的应用对数据库所做的更改。

    test "admins can change a user's board member status" do
      assert_changes -> { @member.board_member }, from: false, to: true do
        patch user_path(@member, as: @admin), params: { user: { board_member: true } }
        @member.reload # get changes performed by app to db
      end
      # consider extracting this into separate examples
      assert_redirected_to(user_path(@member))
      assert_equal "Profile was successfully updated.", flash[:notice]
    end
    

    【讨论】:

    • 虽然我真的不建议以这种方式构建它。更好的解决方案是有一个单独的表来跟踪用户角色。这使您可以添加其他功能,例如跟踪用户何时被授予角色,谁授予了该角色,您还可以通过软删除“撤销”角色。布尔值无法做到这一点。
    • 在这种情况下,您可以通过执行POST /users/:user_id/roles 使用户成为董事会成员。拥有一个单独的控制器可以让您添加额外的授权逻辑,以便您返回正确的 HTTP 代码并拒绝未经授权的用户,而不是默默地删除一个不稳定的参数。
    • 谢谢马克斯。 @member.reload 正是我所需要的。我没有考虑从 User 表中提取角色,所以我会研究一下。在这里感谢您的帮助; )
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 2023-03-22
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多