Module | Sequel::Plugins::ValidationHelpers
In: | lib/sequel/plugins/validation_helpers.rb

The validation_helpers plugin contains instance method equivalents for most of the legacy class-level validations. The names and APIs are different, though. Example:

      Sequel::Model.plugin :validation_helpers
      class Album < Sequel::Model
        def validate
          validates_min_length 1, :num_tracks
        end
      end

The validates_unique validation has a unique API, but the other validations have the API explained here:

Arguments:

- atts - Single attribute symbol or an array of attribute symbols specifying the attribute(s) to validate.

Options:

- :allow_blank - Whether to skip the validation if the value is blank. You should make sure all objects respond to blank if you use this option, which you can do by:

        Sequel.extension :blank

- :allow_missing - Whether to skip the validation if the attribute isn‘t a key in the values hash. This is different from allow_nil, because Sequel only sends the attributes in the values when doing an insert or update. If the attribute is not present, Sequel doesn‘t specify it, so the database will use the table‘s default value. This is different from having an attribute in values with a value of nil, which Sequel will send as NULL. If your database table has a non NULL default, this may be a good option to use. You don‘t want to use allow_nil, because if the attribute is in values but has a value nil, Sequel will attempt to insert a NULL value into the database, instead of using the database‘s default.
- :allow_nil - Whether to skip the validation if the value is nil.
- :message - The message to use. Can be a string which is used directly, or a proc which is called. If the validation method takes a argument before the array of attributes, that argument is passed as an argument to the proc. The exception is the validates_not_string method, which doesn‘t take an argument, but passes the schema type symbol as the argument to the proc.

The default validation options for all models can be modified by changing the values of the Sequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS hash. You change change the default options on a per model basis by overriding a private instance method default_validation_helpers_options.

By changing the default options, you can setup internationalization of the error messages. For example, you would modify the default options:

      Sequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS.merge!(
        :exact_length=>{:message=>lambda{|exact| I18n.t("errors.exact_length", :exact => exact)}},
        :integer=>{:message=>lambda{I18n.t("errors.integer")}},
        ...
      )

and then use something like this in your yaml translation file:

      en:
        errors:
          exact_length: "is not %{exact} characters"
          integer: "is not a number"

Note that if you want to support internationalization of Errors#full_messages, you need to override the method. Here‘s an example:

      class Sequel::Model::Errors
        ATTRIBUTE_JOINER = I18n.t('errors.joiner').freeze
        def full_messages
          inject([]) do |m, kv|
            att, errors = *kv
            att.is_a?(Array) ? Array(att).map!{|v| I18n.t("attributes.#{v}")} : att = I18n.t("attributes.#{att}")
            errors.each {|e| m << (e.is_a?(LiteralString) ? e : "#{Array(att).join(ATTRIBUTE_JOINER)} #{e}")}
            m
          end
        end
      end

### Classes and Modules

Module Sequel::Plugins::ValidationHelpers::InstanceMethods

### Constants

DEFAULT_OPTIONS | = | { :exact_length=>{:message=>lambda{|exact| "is not #{exact} characters"}}, :format=>{:message=>lambda{|with| 'is invalid'}}, :includes=>{:message=>lambda{|set| "is not in range or set: #{set.inspect}"}}, :integer=>{:message=>lambda{"is not a number"}}, :length_range=>{:message=>lambda{|range| "is too short or too long"}}, :max_length=>{:message=>lambda{|max| "is longer than #{max} characters"}, :nil_message=>lambda{"is not present"}}, :min_length=>{:message=>lambda{|min| "is shorter than #{min} characters"}}, :not_string=>{:message=>lambda{|type| type ? "is not a valid #{type}" : "is a string"}}, :numeric=>{:message=>lambda{"is not a number"}}, :type=>{:message=>lambda{|klass| "is not a #{klass}"}}, :presence=>{:message=>lambda{"is not present"}}, :unique=>{:message=>lambda{'is already taken'}} |  | Default validation options used by Sequel. Can be modified to change the error messages for all models (e.g. for internationalization), or to set certain default options for validations (e.g. :allow_nil=>true for all validates_format).

[Validate]