【问题标题】:Rails 4 strong parameters: check whether a param is in the whitelist, without actually updating itRails 4强参数:检查参数是否在白名单中,而不实际更新它
【发布时间】:2014-05-27 13:17:36
【问题描述】:

我使用 AJAX 构建了一些内联编辑功能,允许用户更新页面上的大量小信息,然后构建 JS 来更新页面。同样的逻辑应该处理数十个不同的迷你表单,这些表单包含不同的属性或属性集(如名字和姓氏)。在大多数情况下,被更改的值与页面上要更新的值相同,因此很容易编写一个 Jquery 调用来相应地更新内容。但是有时我想覆盖将要更新的内容:例如,当用户更改他们的邮政编码时,他们的城市和州也应该在之后显示。

在这些情况下,我可以添加一个表单元素来指示应该在页面上更新哪些字段。但是当我考虑安全性时,控制器逻辑会变得复杂。我不希望用户能够更改该表单元素以显示其任何属性;相反,我想检查给定属性是否在他们可以更新的属性白名单中(强参数样式),然后使用该信息来决定控制器是否允许在页面上显示该属性。

强大的参数设置似乎不允许这样做。我可以检查 user_params 中是否存在参数,但如果我实际上没有通过 params 哈希提交该属性的新值,则它被视为 user_params 中不存在。

有没有办法检查一个属性是否“在白名单上”,即。是否会被 user_params 接受,即使我们没有尝试更改它?

或者,您是否有其他方法可以满足这一需求?

【问题讨论】:

    标签: ruby-on-rails strong-parameters


    【解决方案1】:

    我会在常量中定义您允许的参数列表,然后检查它。 Here's a similar SO post that does this.

    简而言之:

    # In your model object (e.g. MyModel)
    PERMITTED_FIELDS = %w(field1 field2 field3)
    
    # In your controller
    def my_object_params
      params.require(:user).permit(MyModel::PERMITTED_FIELDS)
    end
    

    然后您可以根据需要在其他地方访问MyModel::PERMITTED_FIELDS

    【讨论】:

    • 啊,这将是完美的。我不知道#permit 会接受一个数组。谢谢!
    • 很高兴听到这个消息。注意:即使#permit 不接受数组,您仍然可以从一个开始,然后用* 将其分解(基本上只是删除方括号):.permit(*MyModel::PERMITTED_FIELDS)
    • 再次感谢。我见过周围的啪啪声,但没有玩太多。这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多