【问题标题】:Rails custom validation involving current_user涉及 current_user 的 Rails 自定义验证
【发布时间】:2016-08-23 00:24:40
【问题描述】:

我一直在开发一个 Rails 应用程序,我们允许不同的用户为模型的属性提交不同的值。

例如,所有用户都可以提交大于 10 的值,而管理员也可以提交一位数的值。

我们知道模型无法访问 current_user 帮助器,因此您不能轻松编写自定义验证器。

实现此类功能时的最佳做法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby validation activemodel


    【解决方案1】:

    这是validation contexts 的完美用例。您在模型中定义 上下文,然后您的控制器指定要使用的上下文。

    这是贾斯汀·韦斯 (Justin Weiss) 写的一篇关于它们的好文章——尽管他没有提到它们解决了任何其他方式都无法很好解决的问题,每个用户的验证规则就是一个完美的例子,因为您的模型无法访问当前用户,并且您的控制器并非旨在指定验证规则:

    https://www.justinweiss.com/articles/a-lightweight-way-to-handle-different-validation-situations/

    【讨论】:

      【解决方案2】:

      这可能是您在控制器中强制执行验证的情况。严格来说,这不是关于模型验证,而是关于用户授权。 Pundit 是一个很好的授权宝石,或者你可以自己滚动。

      【讨论】:

        【解决方案3】:

        始终建议将current_user 之类的逻辑保留在模型之外。 但鉴于您的要求,

        好吧,我们的控制器知道current_user,那么它应该是告诉你的模型的控制器。

        所以在你的模型中为current_user 添加一个attr_accessor 并在您的控制器中执行类似的操作

        @model_obj.current_user = current_user

        现在所有这些都说了。我建议使用模型验证的替代方法。因为实际上您要做的是根据用户的角色授予用户权限。你最好使用像 Pundit 这样的 gem。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多