在ActiveAdmin中创建一个自定义字符串过滤器,默认为Contains,并且不显示字符串过滤器选项下拉菜单 - Formtastic&洗劫

时间:2014-09-25 10:20:17

标签: ruby-on-rails activeadmin formtastic ransack

ActiveAdmin中的默认字符串过滤器选择以下选项:

  • 包含
  • 等于
  • 开头
  • 结束

这会在字符串搜索旁边显示一个下拉列表,您可以在其中选择这些选项。

我的要求是让过滤器使用包含搜索条件但不显示下拉/选择这样做。因此它只有一个搜索输入框,没有选择包含的选择。

我最初通过创建部分来实现这一点,但这是有问题的,因为它无法使用ActiveAdmin提供的其他过滤器。这是部分图像:

enter image description here

我目前的想法是创建一个自定义过滤器来执行此操作。

以下是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

2 个答案:

答案 0 :(得分:4)

要删除对谓词下拉的需要,可以使用Ransack的基于字符串的查询界面。例如,如果您有一个ActiveRecord User类,其属性为name,并且您希望在其上包含过滤器,则可以执行以下操作:

ActiveAdmin.register User do
  filter :name_cont, label: 'User name'
end

这将生成:

User name input field

它将搜索包含其名称中引入的输入的Users

答案 1 :(得分:1)

根据您的问题,我可以得出结论,您希望有一个过滤器,按:contains搜索,而不是其他选项(:equals, :starts_with, :ends_with)的下拉列表。

如果我理解你的话,你可以简单地使用它(而不必麻烦地使用ActiveAdmin):

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

作为奖励,我可以建议你很好的宝石('chosen-rails'我今天发现它),它允许你在过滤器上做自动完成(最初它用于在new / edit中自动完成相关模型)形式,但我已经根据我的需要轻松调整了它。)

因此对于过滤器来说,它很简单:

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",{{1}等等。


修改

好的,根据您的需要调整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运行,请查看:)