Adding Numeric Range Filtering to ActiveAdmin

2.3k Views Asked by At

Greetings and Happy Holidays 2015 --

I tried to add numeric range filtering per the excellent blog post by Boris Stall.

I'm running:

  • Rails 4.2.4
  • Ruby 2.2.3
  • ActiveAdmin 1.0.0pre2

I keep running into this error:

Unable to find input class NumericRangeInput

Here is my config/initializers/active_admin/filter_numeric_range_input.rb

module ActiveAdmin
  module Inputs
    class FilterNumericRangeInput < ::Formtastic::Inputs::StringInput # Add filter module wrapper
      include ActiveAdmin::Inputs::Filters::Base

      def to_html
        input_wrapping do
          [ label_html,
            builder.text_field(gt_input_name, input_html_options(gt_input_name)),
            template.content_tag(:span, "-", :class => "seperator"),
            builder.text_field(lt_input_name, input_html_options(lt_input_name)),
          ].join("\n").html_safe
        end
      end

      def gt_input_name
        "#{method}_gteq"
      end
      alias :input_name :gt_input_name

      def lt_input_name
        "#{method}_lteq"
      end

      def input_html_options(input_name = gt_input_name)
        current_value = @object.send(input_name)
         { :size => 10, :id => "#{input_name}_numeric" , :value => current_value }
      end
    end
  end
end

I'm simply trying:

filter :id, as: :numeric_range

I've researched the potential issues integrating AA, Ransack, Formtastic, etc., but I'm not advanced enough to know where to go from here. Any help is greatly appreciated.

2

There are 2 best solutions below

1
On

At this point you just need filter :id, as: :numeric

2
On

It seems newer versions of ActiveAdmin might have a different strategy for loading or naming other classes in the input module. I noticed that the class name in the file is called FilterNumericRangeInput. So AA must be doing something to convert the name, we just need to figure out which symbol to give to convert properly. So as an experiment, I tried to rename the symbol in app/admin/test.rb to:

filter :id, as: :numeric_range_2

And I got the error:

Unable to find input class NumericRange2Input

So with that hint I tried changing the symbol name to:

filter :id, as: :filter_numeric_range

And it worked.