代码之家  ›  专栏  ›  技术社区  ›  fongfan999

在Ruby on Rails中,允许当前用户角色使用参数的优雅方式是什么?

  •  2
  • fongfan999  · 技术社区  · 8 年前

    我的应用程序有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)
    

    我不喜欢删除键,因为逻辑非常复杂,很难阅读。我想通过行动和角色来定义逻辑。

    如何允许参数按其角色进行操作?最好的方法是什么?有没有办法像权威人士那样获得授权?

    非常感谢。

    注: [:a,:b,:c,:d] 是 动态地 通过使用Pundit检查策略生成。权威人士是否有任何扩展?

    3 回复  |  直到 8 年前
        1
  •  2
  •   J. Doe    8 年前

    我通常创建模块 ParamsSanitizer 在…内 app/services .

    在控制器中,我这样调用: ParamsSanitizer::Products.sanitize(params, current_user)

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

        2
  •  1
  •   Junan Chakma    8 年前

    根据属性的角色将属性设置为常量。

    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
    
        3
  •  0
  •   Anurag Aryan    8 年前

    我不确定这是否是你想要的,但你可以这样做

    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
    
    推荐文章