【问题标题】:Rails Strong Parameters Merging or Conditional Strong ParametersRails 强参数合并或条件强参数
【发布时间】:2015-12-03 00:40:56
【问题描述】:

根据用户授权,我想清理参数以包括允许他们更新的参数。一个模型有 5 种不同的角色,我宁愿不列出 25 种可能的组合并调用

params.require(:asset).permit( 东西)

25 次

有没有办法“构建”强参数?我发现的唯一可能的方法是“合并”,但我似乎无法让它工作

这就是我所在的地方:

def update_params
    p = params.require(:asset)
    if can? :update, Asset
      p.merge params.require(:asset).permit(:code, :description)
    end
    if can? :update, Ability::THING1
      p.merge params.require(:asset).permit(:some_nested_stuff => [:id, :quantity, :_destroy],
                   :some_other_nested_stuff => [:id, :quantity, :_destroy])
    end
    if can? :update, Ability::THING2
      p.merge params.require(:asset).permit(more_nested_stuff: [:id, :date, :note])
    end
    if can? :update, AssetNote
      p.merge params.require(:asset).permit(notes_attributes: [:id, :note, :_destroy])
    end
    p
  end

这样我得到“ForbiddenAttributesError”,而不是仅仅丢弃属性。

【问题讨论】:

    标签: ruby-on-rails strong-parameters cancancan input-sanitization


    【解决方案1】:

    据我所知,合并是要走的路。另一方面,您的合并不起作用,因为.merge 不会更新哈希p,您可以执行p = p.merge 或使用p.merge!,它会修改p

    另外,根据模型的嵌套程度,您可能需要.deep_merge 而不是merge

    希望对您有所帮助。

    【讨论】:

    • 干杯。在我发布问题并进行更改后,我意识到这一点,但我仍然没有爱:(同样的错误也尝试过 deep_merge!
    • 你的模型中有对应的accepts_nested_attributes_for吗?
    • 是的,在添加任何这种清理之前一切正常。它曾经只是一个大的 params.require(blah).permit(lots_of_blah)
    • 在构建数组并将其传递给许可后,它似乎正在工作。我不确定这是否是最佳实践解决方案
    【解决方案2】:

    看起来这个解决方案正在运行 - 只需构建一个数组并将其传递给许可。我不知道这是否被认为是最佳做法

    def update_params
        a = []
        if can? :update, Asset
          a += [:code, :description]
        end
        if can? :update, Ability::THING1
          a += [:some_nested_stuff => [:id, :quantity, :_destroy],
                       :some_other_nested_stuff => [:id, :quantity, :_destroy]]
        end
        ......
        params.require(:asset).permit(a)
      end
    

    【讨论】:

    • 只是好奇,生成的散列看起来像用merge生成的散列吗?
    • 我没有检查。也许我用错误的参数调用合并,这可能是它不起作用的原因?
    • 是的,绝对有可能。这可能导致了 ForbiddenAttributesError 错误。无论如何,很高兴你找到了让它工作的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多