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

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

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

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

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

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

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

解决方法

这里是为Rails 3项目编写的一些代码,正是您正在谈论的.
# Define a "warnings" validation bucket on ActiveRecord objects.
#
# Example usage:
#
#   class MyModel < ActiveRecord::Base
#     warning do |vehicle_asset|
#       vehicle_asset.warnings.add(:description,"should be 'bob'") unless vehicle_asset.description == 'bob'
#     end
#   end
#
# THEN:
#
#   <ActiveRecord object>.description = 'Fred'
#   <ActiveRecord object>.sensible? # => false
#   <ActiveRecord object>.warnings.full_messages # => ["Description should be 'bob'"]
module Warnings
  module Validations
    extend ActiveSupport::Concern
    include ActiveSupport::Callbacks

    included do
      define_callbacks :warning
    end

    module ClassMethods
      def warning(*args,&block)
        options = args.extract_options!
        if options.key?(:on)
          options = options.dup
          options[:if] = Array.wrap(options[:if])
          options[:if] << "validation_context == :#{options[:on]}"
        end
        args << options
        set_callback(:warning,*args,&block)
      end
    end

    # Similar to <ActiveRecord object>.valid? but for warnings
    def sensible?
      self.warnings.clear
      self.run_callbacks :warning
      self.warnings.empty?
    end

    # Similar to <ActiveRecord object>.errors but returns a warnings collection
    def warnings
      @warnings ||= ActiveModel::Errors.new(self)
    end

  end
end

ActiveRecord::Base.send(:include,Warnings::Validations)

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

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

猜你在找的Ruby相关文章