module ActiveAdmin::Dry::Validation::DSL

Public Instance Methods

schema(outer_schema: nil, &block) click to toggle source
# File lib/activeadmin/dry/validation/dsl.rb, line 5
def schema(outer_schema: nil, &block) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
  if block_given?
    result = ::Dry::Validation.Schema(::Dry::Validation::Schema::Params, {}, &block)
  elsif outer_schema.present? && outer_schema.is_a?(::Dry::Validation::Schema)
    result = outer_schema
  else
    result
  end
  controller do
    before_action :ensure_schema, only: %i[create update]

    define_method(:schema) do
      result
    end

    define_method(:ensure_schema) do
      params[:id].blank? ? build_resource : assign_attributes(resource, resource_params)
      action = params[:id].blank? ? :new : :edit
      schema.call(resource_params.first.to_h).errors.each do |rule, messages|
        messages.each { |message| resource.errors.add(rule, message) }
      end
      return render action unless resource.errors.empty?
    end
  end
end