【发布时间】:2016-08-23 00:24:40
【问题描述】:
我一直在开发一个 Rails 应用程序,我们允许不同的用户为模型的属性提交不同的值。
例如,所有用户都可以提交大于 10 的值,而管理员也可以提交一位数的值。
我们知道模型无法访问 current_user 帮助器,因此您不能轻松编写自定义验证器。
实现此类功能时的最佳做法是什么?
【问题讨论】:
标签: ruby-on-rails ruby validation activemodel
我一直在开发一个 Rails 应用程序,我们允许不同的用户为模型的属性提交不同的值。
例如,所有用户都可以提交大于 10 的值,而管理员也可以提交一位数的值。
我们知道模型无法访问 current_user 帮助器,因此您不能轻松编写自定义验证器。
实现此类功能时的最佳做法是什么?
【问题讨论】:
标签: ruby-on-rails ruby validation activemodel
这是validation contexts 的完美用例。您在模型中定义 上下文,然后您的控制器指定要使用的上下文。
这是贾斯汀·韦斯 (Justin Weiss) 写的一篇关于它们的好文章——尽管他没有提到它们解决了任何其他方式都无法很好解决的问题,每个用户的验证规则就是一个完美的例子,因为您的模型无法访问当前用户,并且您的控制器并非旨在指定验证规则:
https://www.justinweiss.com/articles/a-lightweight-way-to-handle-different-validation-situations/
【讨论】:
这可能是您在控制器中强制执行验证的情况。严格来说,这不是关于模型验证,而是关于用户授权。 Pundit 是一个很好的授权宝石,或者你可以自己滚动。
【讨论】:
始终建议将current_user 之类的逻辑保留在模型之外。
但鉴于您的要求,
好吧,我们的控制器知道current_user,那么它应该是告诉你的模型的控制器。
所以在你的模型中为current_user 添加一个attr_accessor
并在您的控制器中执行类似的操作
@model_obj.current_user = current_user
现在所有这些都说了。我建议使用模型验证的替代方法。因为实际上您要做的是根据用户的角色授予用户权限。你最好使用像 Pundit 这样的 gem。
【讨论】: