class ActiveDryForm::Form

Constants

ResultError

Attributes

base_errors[R]
record[R]

Public Class Methods

action(method) click to toggle source
# File lib/active_dry_form/form.rb, line 86
    def self.action(method)
      alias_method :"__#{method}", method

      class_eval <<~RUBY, __FILE__, __LINE__ + 1
        # def create(...)
        #   if validator.failure?
        #     @base_errors = validator.errors.filter(:base?).map(&:to_s).presence
        #     return Failure(:validate_invalid)
        #   end
        #
        #   result = __create(...)
        #
        #   unless result.is_a?(::Dry::Monads::Result)
        #     raise ResultError, 'method `create` should be returning `monad`'
        #   end
        #
        #   case result
        #   in Failure[:failure_service, base_errors]
        #     @base_errors = base_errors
        #   else
        #   end
        #
        #   result
        # end

        def #{method}(...)
          if validator.failure?
            @base_errors = validator.errors.filter(:base?).map(&:to_s).presence
            return Failure(:validate_invalid)
          end

          result = __#{method}(...)

          unless result.is_a?(::Dry::Monads::Result)
            raise ResultError, 'method `#{method}` should be returning `monad`'
          end

          case result
          in Failure[:failure_service, base_errors]
            @base_errors = base_errors
          else
          end

          result
        end
      RUBY
    end
default(method) click to toggle source
# File lib/active_dry_form/form.rb, line 72
    def self.default(method)
      alias_method :"__#{method}", method

      class_eval <<~RUBY, __FILE__, __LINE__ + 1
        # def create_default(...)
        #  @params.merge!(__create_default(...))
        # end

        def #{method}(...)
          @params.merge!(__#{method}(...))
        end
      RUBY
    end
fields(namespace, &block) click to toggle source
# File lib/active_dry_form/form.rb, line 17
def self.fields(namespace, &block)
  const_set :NAMESPACE, ActiveModel::Name.new(nil, nil, namespace.to_s)
  const_set :CURRENT_CONTRACT, Class.new(ContractBase, &block).new
  const_set :FIELDS_INFO, self::CURRENT_CONTRACT.schema.info[:keys]

  self::FIELDS_INFO.each do |key, value|
    if value[:keys]
      sub_klass = Class.new do
        const_set :NAMESPACE, ActiveModel::Name.new(nil, nil, key.to_s)
        const_set :FIELDS_INFO, value[:keys]

        def initialize(params, record, errors)
          @params = params || {}
          @record = record
          @errors = errors || {}
        end

        self::FIELDS_INFO.each_key do |sub_key|
          define_method sub_key do
            @params[sub_key] || @record.try(sub_key)
          end

          def model_name
            self.class::NAMESPACE
          end

          def info(sub_key)
            self.class::FIELDS_INFO[sub_key]
          end

          # ActionView::Helpers::Tags::Translator#human_attribute_name
          def to_model
            self
          end

          def self.human_attribute_name(field)
            I18n.t(field, scope: :"activerecord.attributes.#{self::NAMESPACE.i18n_key}")
          end

          def errors
            @errors
          end
        end
      end
      define_method key do
        sub_klass.new(@params[key], @record.try(key), errors[key])
      end
    else
      define_method key do
        @params[key] || @record.try(key)
      end
    end
  end
end
human_attribute_name(field) click to toggle source
# File lib/active_dry_form/form.rb, line 52
def self.human_attribute_name(field)
  I18n.t(field, scope: :"activerecord.attributes.#{self::NAMESPACE.i18n_key}")
end
new(params, record, errors) click to toggle source
# File lib/active_dry_form/form.rb, line 28
def initialize(params, record, errors)
  @params = params || {}
  @record = record
  @errors = errors || {}
end

Public Instance Methods

errors() click to toggle source
# File lib/active_dry_form/form.rb, line 56
def errors
  @errors
end
info(sub_key) click to toggle source
# File lib/active_dry_form/form.rb, line 43
def info(sub_key)
  self.class::FIELDS_INFO[sub_key]
end
model_name() click to toggle source
# File lib/active_dry_form/form.rb, line 39
def model_name
  self.class::NAMESPACE
end
persisted?() click to toggle source
# File lib/active_dry_form/form.rb, line 169
def persisted?
  @record&.persisted?
end
to_key() click to toggle source
# File lib/active_dry_form/form.rb, line 173
def to_key
  key = @record&.id
  [key] if key
end
to_model() click to toggle source

ActionView::Helpers::Tags::Translator#human_attribute_name

# File lib/active_dry_form/form.rb, line 48
def to_model
  self
end
to_param() click to toggle source

используется при генерации URL, когда record.persisted?

# File lib/active_dry_form/form.rb, line 179
def to_param
  @record.id.to_s
end
validator() click to toggle source
# File lib/active_dry_form/form.rb, line 183
def validator
  @validator ||= self.class::CURRENT_CONTRACT.call(@params, { form: self })
end
view_component() click to toggle source
# File lib/active_dry_form/form.rb, line 191
def view_component
  self.class.module_parent::Component.new(self)
end

Private Instance Methods

_deep_transform_values_in_params!(object) click to toggle source
# File lib/active_dry_form/form.rb, line 195
        def _deep_transform_values_in_params!(object)
  case object
  when String
    object.strip.presence
  when Hash
    object.transform_values! { |value| _deep_transform_values_in_params!(value) }
  when Array
    object.map! { |e| _deep_transform_values_in_params!(e) }
    object.compact!
    object
  else
    object
  end
end