文本框的自动补全是一种可以帮助用户快速而精准地填写表单的功能,它是基于数据库的某些字段中已经存在的数据。我们以Google Suggest(http://google.com/webhp?complete=1)作为这种功能的例子。当你在搜索文本框中输入一个关键词时,Google Suggest便会为你推荐可能与你所搜寻的主题相匹配的关键词。在Rails中,提供这类功能的是auto_complete_for helper。
我们来通过为Location(地址)字段建议可能的值以强化我们的events应用程序,从而为用户节省了输入数据的时间。这将有效地减少数据库中已存在的地址输入错误的几率,而且仍允许用户输入新的地址名称。
为了实现这一效果,我们首先为events控制器添加auto_complete_for声明,如源码7-16所示。
源码7-16 在app/controllers/events_controller.rb里添加auto_complete_for helper
class EventsController < ApplicationController
before_filter :authenticate, :except => [:index, :show]
auto_complete_for :event, :location
#...
end
这段代码将告诉控制器返回数据库中存在的地址列表。
默认情况下,auto_complete_for将所返回记录的总数限制在10以内,并并搜索结果进行排序。这些通常都是合理的默认值;然而,如果你需要覆盖它们,只需将其定义在hash中,并传递给auto_complete_for,如下所示:
auto_complete_for :event, :location, :limit => 25, rder => 'title DESC'
在模板方面,我们需要调整一下处理地址项的方式。幸运的是,这很容易做到。只需将app/views/events/_form.rhtml中的下列命令:
<p><label for="event_location">Location</label><br/>
<%= text_field 'event', 'location' %></p>
替换成源码7-17所示的命令。
源码7-17 更新app/views/events/_form以使用自动补全功能
<p><label for="event_location">Location</label><br/>
<%= text_field_with_auto_complete :event, :location %></p>
代码很少,而结果却令人相当高兴。正如你在图7-7中看到的,当你开始输入地址时,auto_complete_for helper便运行一个数据库搜索,为地址项查找存在的值,来匹配你输入的内容。如果你看到了想要输入的地址,就可以(用鼠标或键盘)选择它。如果你没看到这个地址,便可以略过这些建议的值,继续输入。