ruby-on-rails – 有效的方式来报告记录验证警告以及错误?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 有效的方式来报告记录验证警告以及错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个Rails项目,在大多数应用程序中,我们拥有一些难以置信的验证规则,所有对象必须符合要求才能持久化.当然,ActiveModel的验证是完美的 – 我们使用Rails默认值和我们自己的手动滚动验证的组合.

然而,越来越多的我们正在针对使用案例,我们希望提醒用户,在最严格的意义上,他们的数据不是无效的情况下,他们应该检查的元素,但不应该本身防止记录持续发生.几个例子,我的头顶:

>在所有CAPS中提交了一个帖子标题,这可能是有效的,但可能不是
>身体文字的一小段超过x个字数少于或超过建议字数

验证模块是一个很好的比喻,我们如何处理验证错误 – 并且有很多匹配器已经可用 – 理想情况下,我希望能够重用该基本代码,而是生成一组警告与错误.这将使我们能够以不同于我们的用户的方式强调这些情况,而不是暗示可能的违反房屋风格的行为相当于更为严重,严格执行的规则.

我已经看过像activemodel-warnings这样的宝石,但是通过改变在记录被验证时检查哪些匹配器,相应地扩展或缩小错误集合就可以工作.同样,我查看了内置的:on参数进行验证,看看我是否可以手动滚动一些东西,但是再次,所有的违规行为都将以错误收集而不是分离出来.

有没有人尝试过类似的东西?我不能想像我是唯一想要实现这一目标的人,但现在正在画一个空白的

解决方法

这里是为Rails 3项目编写的一些代码,正是您正在谈论的.
  1. # Define a "warnings" validation bucket on ActiveRecord objects.
  2. #
  3. # Example usage:
  4. #
  5. # class MyModel < ActiveRecord::Base
  6. # warning do |vehicle_asset|
  7. # vehicle_asset.warnings.add(:description,"should be 'bob'") unless vehicle_asset.description == 'bob'
  8. # end
  9. # end
  10. #
  11. # THEN:
  12. #
  13. # <ActiveRecord object>.description = 'Fred'
  14. # <ActiveRecord object>.sensible? # => false
  15. # <ActiveRecord object>.warnings.full_messages # => ["Description should be 'bob'"]
  16. module Warnings
  17. module Validations
  18. extend ActiveSupport::Concern
  19. include ActiveSupport::Callbacks
  20.  
  21. included do
  22. define_callbacks :warning
  23. end
  24.  
  25. module ClassMethods
  26. def warning(*args,&block)
  27. options = args.extract_options!
  28. if options.key?(:on)
  29. options = options.dup
  30. options[:if] = Array.wrap(options[:if])
  31. options[:if] << "validation_context == :#{options[:on]}"
  32. end
  33. args << options
  34. set_callback(:warning,*args,&block)
  35. end
  36. end
  37.  
  38. # Similar to <ActiveRecord object>.valid? but for warnings
  39. def sensible?
  40. self.warnings.clear
  41. self.run_callbacks :warning
  42. self.warnings.empty?
  43. end
  44.  
  45. # Similar to <ActiveRecord object>.errors but returns a warnings collection
  46. def warnings
  47. @warnings ||= ActiveModel::Errors.new(self)
  48. end
  49.  
  50. end
  51. end
  52.  
  53. ActiveRecord::Base.send(:include,Warnings::Validations)

顶部的评论显示如何使用它.您可以将此代码放入初始化程序中,然后可以向所有ActiveRecord对象提供警告.然后基本上只是添加一个警告做块到每个模型的顶部,可以有警告,只需手动添加尽可能多的警告,你想要的.在您调用.sensible之前,此块将不会被执行?在模型上.

此外,请注意,由于警告不是验证错误,所以即使不是“明智的”(正如我所说),模型仍然在技术上是有效的.

猜你在找的Ruby相关文章