Sha256: 1b293f198cc7cb07f965cd7d0d516580ecf38b9e96108127dd39d325db96ddd9

Contents?: true

Size: 1.95 KB

Versions: 1

Compression:

Stored size: 1.95 KB

Contents

require 'json'

module SlayerRails
  module Extensions
    module Form
      extend ActiveSupport::Concern

      included do
        include ActiveModel::Validations

        def validate!
          return if valid?
          message = errors.full_messages.join(', ')
          raise Slayer::FormValidationError, message unless valid?
        end

        def as_model(klass, attr_map = nil)
          all_attrs = klass.new.attributes.keys.map(&:to_sym)
          return klass.new(attributes.slice(*all_attrs)) if attr_map.nil?
          attrs = attr_map.inject({}) do |memo, (key, val)|
            memo[key] = self.send(val)
            memo
          end
          klass.new(attrs)
        end

        class << self
          def from_params(params, additional_params: {}, root_key: nil)
            params     = params.respond_to?(:to_unsafe_h) ? params.to_unsafe_h : params.to_h
            params     = params.deep_symbolize_keys
            attr_names = attribute_set.map(&:name)

            params = params.fetch(root_key, {}) if root_key.present?

            attr_hash = params
                        .merge(params.slice(*attr_names))
                        .merge(additional_params)

            new(attr_hash)
          end

          def from_model(model)
            attr_hash = attribute_set.map(&:name)
                        .select { |attr_name| model.respond_to?(attr_name) }
                        .map    { |attr_name| [attr_name, model.public_send(attr_name)] }

            new(attr_hash.to_h)
          end

          def from_json(json)
            from_params(JSON.parse(json))
          end

          def validates_associated(*keys)
            self.validates_each(*keys) do |record, attr, value|
              unless value.valid?
                value.errors.each do |field, err_message|
                  record.errors.add(attr, "#{field} #{err_message}")
                end
              end
            end
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
slayer_rails-0.4.0.beta4 lib/slayer_rails/extensions/form.rb