Rails+Active Admin中用Formtastic实现HTML Datalist输入失败求助
嘿,我碰到过类似的问题!Formtastic 2.x确实没有内置:datalist这个输入类型,这就是你看到"Unable to find input class for datalist"错误的原因。别担心,有两种靠谱的方法能帮你实现HTML datalist的自动补全功能:
方法一:自定义Formtastic Datalist输入类型
你可以给Formtastic添加一个自定义的输入类,让它原生支持:datalist类型,步骤很简单:
- 在你的Rails项目里创建
app/inputs/datalist_input.rb文件,写入以下代码:
class DatalistInput < Formtastic::Inputs::StringInput def input_html_options super.merge(list: "#{@method}_datalist") end def to_html input_wrapping do label_html << builder.text_field(method, input_html_options) << %(<datalist id="#{@method}_datalist">) << collection.map { |item| %(<option value="#{ERB::Util.html_escape(item)}">) }.join << %(</datalist>) end end end
这个类继承自Formtastic的StringInput,会自动生成对应的datalist标签,并把文本框和datalist关联起来,同时处理了HTML转义避免安全问题。
- 现在回到你的Active Admin表单代码,原来的写法就能正常工作了:
<%= f.input :fav_book, :as => :datalist, :collection => books.pluck(:product).uniq.sort %>
(这里加了uniq.sort是为了去重和排序,让补全列表更友好,你可以根据业务需求调整)
方法二:直接嵌入原生HTML datalist标签
如果你不想自定义输入类,也可以直接在Formtastic的输入里手动拼接原生datalist标签,这种方式更直接:
<%= f.input :fav_book, :as => :string, :input_html => { :list => 'books_datalist' } %> <datalist id="books_datalist"> <% books.pluck(:product).uniq.each do |book| %> <option value="<%= ERB::Util.html_escape(book) %>"> <% end %> </datalist>
这里用:as => :string指定输入类型为文本框,通过:input_html给文本框加上list属性,手动关联到下面的datalist标签,同样处理了HTML转义保证安全性。
两种方法都能在你的Rails 3.2 + Active Admin + Formtastic 2.x环境下正常运行,你可以根据自己的偏好选择。
内容的提问来源于stack exchange,提问作者Priya
相关产品推荐
相关产品推荐

