通过当前用户在 Ruby 和 Rails 中的角色允许参数的优雅方式?
The elegant way to permit parameters by current user's role in Ruby on Rails?
我的应用程序有 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 有任何扩展吗?
我不确定这是否是你想要的,但你可以这样做
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
根据属性将属性设置为常量。
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
我通常在 app/services
中创建模块 ParamsSanitizer
。
在控制器中,我这样调用:ParamsSanitizer::Products.sanitize(params, current_user)
所有逻辑都将在这些类中定义。
我的应用程序有 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 有任何扩展吗?
我不确定这是否是你想要的,但你可以这样做
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
根据属性将属性设置为常量。
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
我通常在 app/services
中创建模块 ParamsSanitizer
。
在控制器中,我这样调用:ParamsSanitizer::Products.sanitize(params, current_user)
所有逻辑都将在这些类中定义。