module Errorio
Extend your models and classes with errors, warnings and other notices
Examples:
Extend ordinary AR model with special collection of warnings
and notices
class Task < ApplicationRecord
include Errorio errorionize :errors, :warnings, :notices # :errors is initialized by ActiveRecord, so it is redundant in this case validates :name, presence: { code: :E0230 } validate :special_characters_validation private def special_characters_validation return if name =~ /^[a-z0-9]*$/i exceptions = name.gsub(/[^a-z0-9]/i).map{ |a| "'#{a}'" }.join(','), warnings.add(:name, :special_characters, code: :E0231, chars: exceptions, message: 'Special characters are not recommended for name') end
end
result = Task.create result.errors.to_e
>¶ ↑
[
{ :code=>:E0230, :key=>:name, :type=>:blank, :message=>"Task Name can't be blank" }
]
result = Task.create 'Do * now!' result.errors.to_e
>¶ ↑
-
result.warnings.to_e
>¶ ↑
[
{ :code=>:E0231, :key=>:name, :type=>:special_characters, :message=>"Special characters ('*', '!') are not recommended for name" }
]
Message should be described in en.yml file
errorio:
messages: E0231: "Special characters (%{chars}) are not recommended for name"
Implement errors and warnings to service class
class Calculate
include Errorio errorionize :errors, :warnings def initialize(a, b) @a = a @b = b end def sum return unless valid? a + b end def valid? return true if @a.is_a?(Numeric) && @b.is_a?(Numeric) errors.add :base, :not_a_numeric, Errorio.by_code(:E1000A) end
end
calc = Calculate.new(3, '1') if (result = calc.sum)
puts result
else
puts calc.errors.to_e
end
> # [¶ ↑
{ :code=>:E1000A, :key=>:base, :type=>:not_a_numeric, :message=>"Special characters are not recommended for name" }
]
Constants
- VERSION
Public Class Methods
by_code(*args)
click to toggle source
Error
details with code
errors.add :base, :invalid, Errorio.by_code
(:E0001, user_id: 129)
# File lib/errorio.rb, line 108 def by_code(*args) Details.by_code(*args) end
included(base)
click to toggle source
# File lib/errorio.rb, line 113 def self.included(base) base.extend ClassMethods base.send :prepend, InstanceMethods # Patch for ActiveRecord classes # AR doesn't call `initialize` method for objects that created on data that was fetched from database, # so you cannot override it. You must use `after_initialize` callback to do that. base.after_initialize :errorio_initializer if base.respond_to?(:after_initialize) end