1

基于用户授权,我想清理参数以包括允许他们更新的参数。一个模型有 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”,而不是仅仅丢弃属性。

4

2 回答 2

1

看起来这个解决方案正在工作 - 只需构建一个数组并将其传递给允许。我不知道这是否会被认为是最佳实践

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
于 2015-12-03T01:03:10.163 回答
1

据我所知,合并是要走的路。另一方面,您的合并不起作用,因为.merge不更新 hash p,您可以执行p = p.merge或使用p.merge!which does modify p

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

希望有帮助。

于 2015-12-03T00:46:03.427 回答