通过当前用户在 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)

所有逻辑都将在这些类中定义。