根据用户授权,我想清理参数以包含允许更新的参数。一个模型有5种不同的角色,我宁愿不列出25种可能的组合并调用
params.require(:asset).permit(stuff)
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”,而不是丢掉属性。
答案 0 :(得分:1)
据我所知,合并是最佳选择。另一方面,由于.merge
未更新哈希p
,您的合并无效,您可以执行p = p.merge
或使用p.merge!
修改p
}。
此外,根据您的模型的嵌套方式,您可能需要.deep_merge
而不是merge
。
希望有所帮助。
答案 1 :(得分:1)
看起来这个解决方案正在运行 - 只需构建一个数组并将其传递给permit。我不知道这是否算是最佳做法
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