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
答案 0 :(得分:4)
要删除对谓词下拉的需要,可以使用Ransack的基于字符串的查询界面。例如,如果您有一个ActiveRecord
User
类,其属性为name
,并且您希望在其上包含过滤器,则可以执行以下操作:
ActiveAdmin.register User do
filter :name_cont, label: 'User name'
end
这将生成:
它将搜索包含其名称中引入的输入的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
运行,请查看:)