Ruby on rails RoR 3.2.8:是否有HTML5组合框助手?

Ruby on rails RoR 3.2.8:是否有HTML5组合框助手?,ruby-on-rails,ruby-on-rails-3,html,Ruby On Rails,Ruby On Rails 3,Html,现在,我正在使用表单_for.select和选项_for _selectrails helpers创建一个包含模型数据的选择框。然而,我真正需要的是一个组合框,就像HTML5引入的组合框: 谷歌 IE9 是否有rails帮助程序来创建此类元素?没有,但是设置自己的form builder帮助程序方法来实现这样的结果非常容易,一个简单的示例是: app/form\u builders/combobox\u form\u builder.rb 重新启动服务器后,可以使用form builder实现新

现在,我正在使用表单_for.select和选项_for _selectrails helpers创建一个包含模型数据的选择框。然而,我真正需要的是一个组合框,就像HTML5引入的组合框:

谷歌 IE9
是否有rails帮助程序来创建此类元素?

没有,但是设置自己的form builder帮助程序方法来实现这样的结果非常容易,一个简单的示例是:

app/form\u builders/combobox\u form\u builder.rb

重新启动服务器后,可以使用form builder实现新的组合框,方法是在form_中为调用指定builder参数:

<%= form_for @foo, builder: ComboboxFormBuilder do |f| %>
    <%= f.combobox_tag(:browser, options_for_select(["Firefox", "Chrome", "IE9"]), :list_id => "list")%>
<% end %>
输出HTML:

<input type="text" name="browser" list="list" id="browser">
<datalist id="list">
  <option value="Firefox">Firefox</option>
  <option value="Chrome">Chrome</option>
  <option value="IE9">IE9</option>
</datalist>

请记住,IE和Safari都不支持HTML5数据列表。

我的代码中的示例:

= form_tag controller:'beer', action: 'create' do
  = text_field :beer, :name, list: 'beer-name'
  %datalist#beer-name
    - Beer.all.each do |beer|
      %option{value: beer.name}
您可能还希望执行以下操作:


不知道会这么简单,让我试试。我如何传递表单和模型参数?当您构建form_for.field时,它知道如何构造名称和idLook,您需要创建自己的FormBuilder子类并使用它,或者可以使用Ruby的元编程对FormBuilder进行修补。我很确定前者是最好的方法,但两者都应该有效。您可以在应用程序中覆盖form_以使用新的FormBuilder,而不是默认的FormBuilder,这样您就不需要对代码进行大量更改。为了清晰起见,请再次更新,以上内容应涵盖您所需的几乎所有内容。如果您想进一步扩展combobox标记以更好地模拟其他form builder帮助程序方法,请参阅for ref。请稍等,这看起来不像有效的HTML,您确定这是正确的吗?@CyleHunter W3C说它是有效的
= form_tag controller:'beer', action: 'create' do
  = text_field :beer, :name, list: 'beer-name'
  %datalist#beer-name
    - Beer.all.each do |beer|
      %option{value: beer.name}
<%= form_for @person do |f| %>
  <%= f.label :first_name, "First Name" %>:
  <%= f.text_field :first_name, list: 'first-name' %>
  <datalist id="first-name">
    <% Person.all.each do |person| %>
      <option value="<%= person.first_name %>"></option>
    <% end %>
  </datalist>
  <%= f.submit %>
<% end %>