Rails 涉及 current_user 的自定义验证
Rails custom validation involving current_user
我一直在开发一个 rails 应用程序,我们允许不同的用户为模型的属性提交不同的值。
例如,所有用户都可以提交大于 10 的值,而管理员也可以提交一位数的值。
我们知道模型无法访问 current_user 助手,因此您无法轻松编写自定义验证器。
实施此类功能的最佳做法是什么?
始终建议将 current_user
之类的逻辑保留在模型之外。
但是鉴于您的要求,
好吧,正如我们的控制器所知道的那样 current_user
那么应该是控制器将其告知您的模型。
因此在您的模型中为 current_user
添加一个 attr_accessor
在你的控制器中做类似
的事情
@model_obj.current_user = current_user
话虽如此。我建议使用模型验证的替代方法。因为实际上您要做的是根据用户的角色授予用户权限。你最好使用像 Pundit 这样的 gem。
这可能是您在控制器中强制执行验证的情况。严格来说这不是关于模型验证,而是关于用户授权。 Pundit 是一个很好的 gem 授权,或者您可以自己滚动。
这是 validation contexts 的完美用例。您在模型中定义 contexts,然后您的控制器指定要使用的上下文。
这是 Justin Weiss 写的一篇关于它们的好文章——尽管他没有提到它们解决了其他任何方法都无法很好解决的问题,每用户验证规则就是一个完美的例子,因为您的模型没有访问当前用户,并且您的控制器未设计为指定验证规则:
https://www.justinweiss.com/articles/a-lightweight-way-to-handle-different-validation-situations/
我一直在开发一个 rails 应用程序,我们允许不同的用户为模型的属性提交不同的值。
例如,所有用户都可以提交大于 10 的值,而管理员也可以提交一位数的值。
我们知道模型无法访问 current_user 助手,因此您无法轻松编写自定义验证器。
实施此类功能的最佳做法是什么?
始终建议将 current_user
之类的逻辑保留在模型之外。
但是鉴于您的要求,
好吧,正如我们的控制器所知道的那样 current_user
那么应该是控制器将其告知您的模型。
因此在您的模型中为 current_user
添加一个 attr_accessor
在你的控制器中做类似
@model_obj.current_user = current_user
话虽如此。我建议使用模型验证的替代方法。因为实际上您要做的是根据用户的角色授予用户权限。你最好使用像 Pundit 这样的 gem。
这可能是您在控制器中强制执行验证的情况。严格来说这不是关于模型验证,而是关于用户授权。 Pundit 是一个很好的 gem 授权,或者您可以自己滚动。
这是 validation contexts 的完美用例。您在模型中定义 contexts,然后您的控制器指定要使用的上下文。
这是 Justin Weiss 写的一篇关于它们的好文章——尽管他没有提到它们解决了其他任何方法都无法很好解决的问题,每用户验证规则就是一个完美的例子,因为您的模型没有访问当前用户,并且您的控制器未设计为指定验证规则:
https://www.justinweiss.com/articles/a-lightweight-way-to-handle-different-validation-situations/