我的应用程序有3个角色::admin, :manager, :editor
并允许所有人创建产品。但是这些用户没有相同的允许参数。
:admin => params.require(:product).permit(:a, :b, :c, :d)
:manager => params.require(:product).permit(:a, :c, :d)
:editor => params.require(:product).permit(:b, :d)
我不想删除密钥,因为逻辑非常复杂且难以阅读。我正在寻找按行动和角色定义逻辑的方式。
我如何通过他们的角色允许参数?最好的方法是什么? Pundit有没有授权方式?
非常感谢你。
注意: [:a,:b,:c,:d] 是通过使用Pundit检查策略生成的动态。 Pundit是否有任何扩展名?
答案 0 :(得分:1)
根据角色将属性设置为常量。
ADMIN_ATTRIBUTES = [:a, :b, :c, :d]
MANAGER_ATTRIBUTES = [:a, :c, :d]
EDITOR_ATTRIBUTES = [:b, :d]
然后你可以添加三种允许参数的方法,并根据当前用户角色调用它们。
def admin_params
params.require(:product).permit(ADMIN_ATTRIBUTES)
end
def manager_params
params.require(:product).permit(MANAGER_ATTRIBUTES)
end
def editor_params
params.require(:product).permit(ADITOR_ATTRIBUTES)
end
答案 1 :(得分:1)
我通常在ParamsSanitizer
内创建模块app/services
。
在控制器中,我这样称呼:ParamsSanitizer::Products.sanitize(params, current_user)
所有逻辑都将在这些类中定义。
答案 2 :(得分:0)
我不确定这是否是你想要的,但你可以做类似
的事情def product_params
case current_user.role
when :admin
params.require(:product).permit(:a, :b, :c, :d)
when :manager
params.require(:product).permit(:a, :c, :d)
when :editor
params.require(:product).permit(:b, :d)
end
end