Создайте настраиваемый строковый фильтр в ActiveAdmin, который по умолчанию содержит значение «Содержит» и не отображает раскрывающийся список выбора строкового фильтра — Formtastic & Ransack

Строковый фильтр по умолчанию в ActiveAdmin имеет следующие параметры:

  • Содержит
  • Равно
  • Начинается с
  • Заканчивается на

Это показывает раскрывающийся список рядом с строковым поиском, где вы можете выбрать эти параметры.

Мое требование состоит в том, чтобы фильтр для использования содержал условие поиска, НО не отображал раскрывающийся список / выбор для этого. Таким образом, у него будет просто поле ввода для поиска, без выбора для выбора.

Первоначально я добился этого, создав партиал, но это было проблематично, поскольку тогда он не мог работать с другими фильтрами, которые предоставляет ActiveAdmin. Вот изображение частичного:

введите здесь описание изображения

Моя текущая мысль состоит в том, чтобы создать собственный фильтр, который делает это.

Итак, ниже приведен стандартный код строкового фильтра в ActiveAdmin. Как это можно изменить по умолчанию, чтобы оно содержало и не отображало раскрывающийся список? Я попытался удалить параметры фильтра, но это не сработало. Есть идеи?

ActiveAdmin использует Ransack и Formtastic

module ActiveAdmin
  module Inputs
    class FilterStringInput < ::Formtastic::Inputs::StringInput
      include FilterBase
      include FilterBase::SearchMethodSelect

      filter :contains, :equals, :starts_with, :ends_with

      # If the filter method includes a search condition, build a normal string search field.
      # Else, build a search field with a companion dropdown to choose a search condition from.
      def to_html
        if seems_searchable?
          input_wrapping do
            label_html <<
            builder.text_field(method, input_html_options)
          end
        else
          super # SearchMethodSelect#to_html
        end
      end

    end
  end
end

person bnussey    schedule 25.09.2014    source источник


Ответы (1)


Из вашего вопроса я могу сделать вывод, что вы ищете фильтр, который ищет по :contains, и не имеет выпадающего списка для других опций (:equals, :starts_with, :ends_with).

Если я вас правильно понимаю, вы можете просто использовать это (и не нужно обезьяньим патчем ActiveAdmin):

filter :attribute_name, as: :string, label: 'Your custom label, if default doesn't fit'

В качестве бонуса я могу предложить вам хороший гем ('chosen-rails', который я обнаружил сегодня ), который позволяет выполнять автозаполнение фильтра (первоначально он использовался для автозаполнения связанной модели в форме создания/редактирования, но я легко настроил его под свои нужды).

Итак, для фильтров это так же просто, как:

filter :title, as: :select, collection: -> {ClientApplication.all.map{|s| s.title}.uniq},  input_html: { class: 'chosen-input' } #or as you've shown before, using pluck :)

Единственным недостатком является то, что он работает только в том случае, если ваша строка начинается с тех же букв, что и искомая вещь, например. если имя "Hello", оно будет подсказывать вам, когда вы вводите "H", "He" и т. д., но не будет, если вы вводите "el", "llo" и т. д.


РЕДАКТИРОВАТЬ

Хорошо, единственное, что вам нужно настроить фильтрацию ActiveAdmin в соответствии с вашими потребностями, это изменить (закомментировать строку, отвечающую за добавление раскрывающегося списка) метод to_html в модуле [SearchMethodSelect][2]:

  module Inputs
    module FilterBase
      module SearchMethodSelect

        #other methods

        def to_html
          input_wrapping do
            label_html  << # your label
            #select_html << # THIS LINE -- the dropdown that holds the available search methods
            input_html     # your input field
          end
        end

        #other methods

      end
    end
  end

Я протестировал его, и он все еще работает как :contains, проверьте :)

person Andrey Deineko    schedule 25.09.2014
comment
Эй, приятель, большое спасибо за твой ответ. Извините, если вопрос не ясен, но я ищу фильтр, который выполняет поиск по содержанию, но у которого вообще нет раскрывающегося списка, так что это просто текстовое поле. Он будет искать по содержимому, но не покажет параметр содержит. - person bnussey; 25.09.2014
comment
Я отредактировал сообщение, включив в него изображение частичной части, которую я сделал, дайте мне знать, если вам нужна какая-либо другая информация. - person bnussey; 25.09.2014
comment
Любые идеи, как определить класс в input_html? - person bnussey; 25.09.2014
comment
Рад, что это сработало для вас! посмотрю позже сегодня или завтра - только что отошел от компьютера - person Andrey Deineko; 25.09.2014
comment
эй, @bnussey, извини - не было времени на твой вопрос, и я боюсь, что не буду активен на SO в эти дни. Надеюсь, вы нашли то, что просили - person Andrey Deineko; 28.09.2014