SimpleForm:创建自定义关联集合输入类型

时间:2017-12-01 16:42:28

标签: ruby-on-rails custom-controls simple-form

我知道我可以像这样创建一个单选按钮集合:

# Slim template
= f.association :requirement, as: :radio_buttons

我想让用户使用单选按钮上方的文本字段过滤单选按钮,因此我稍微修改了一下并提出了以下内容:

label for="filter" Filter
input#filter type="text"
= f.association :requirement, as: :radio_buttons

现在我想使用自定义集合输入类型自动创建这些内容:

= f.association :requirement, as: :autocomplete

所以我尝试创建自定义输入,但我没有让它工作。

我创建了以下自定义输入:

# app/inputs/autocomplete_input.rb
class AutocompleteInput < SimpleForm::Inputs::CollectionRadioButtonsInput
  # ...
end

这会导致以下错误:

undefined method `collection_autocomplete' for #<SimpleForm::FormBuilder:0x007ffc1d90e9a0>
你的意思是? collection_select

我在SimpleForm的源代码中搜索了一下,然后尝试模仿我为单选按钮集合输入找到的内容:

module SimpleForm
  class FormBuilder
    map_type :autocomplete, to: SimpleForm::Inputs::AutocompleteInput
  end
end

但是这导致了这个相当奇怪的错误:

Circular dependency detected while autoloading constant AutocompleteInput

现在我不知道如何继续。我为简单的字符串和textarea输入创建了几个自定义输入,但是对于集合我不知道如何继续。

1 个答案:

答案 0 :(得分:0)

问题来自这一系列的CollectionRadioButtonsInput

 @builder.send(:"collection_#{input_type}",
      attribute_name, collection, value_method, label_method,
      input_options, merged_input_options,
      &collection_block_for_nested_boolean_style
    )

调用collection_autocomplete方法。

我的解决方案:不要从CollectionRadioButtonsInput扩展。复制其来源并进行修改。不干净但会起作用。