我正在寻找一种最简单的方法来实现 Rails 应用程序中文本输入字段的“建议”功能。这个想法是完成存储在数据库列中的名称,在用户键入时为用户提供可能匹配的下拉菜单。
感谢您的任何建议!
我正在寻找一种最简单的方法来实现 Rails 应用程序中文本输入字段的“建议”功能。这个想法是完成存储在数据库列中的名称,在用户键入时为用户提供可能匹配的下拉菜单。
感谢您的任何建议!
Rails 使用该方法使文本字段的“建议”式自动完成变得非常容易text_field_with_auto_complete
。
在 Rails 1.x 中,这个方法是内置的ActionView::Helpers::JavaScriptMacrosHelper
,但在 Rails 2.x 中,它被移到了一个单独的插件中。
假设您有一个名为的模型Post
,它有一个名为 的文本字段title
。在您看来,通常使用text_field_tag
(或f.text_field
)的地方,只需使用text_field_with_auto_complete
:
<%= text_field_with_auto_complete :post, :title %>
此外,在 中PostsController
,您必须做出相应的声明:
class PostsController < ApplicationController
auto_complete_for :post, :title
end
这在幕后做的是动态添加一个调用auto_complete_for_[object]_[method]
到控制器的动作。在上面的例子中,这个动作将被调用auto_complete_for_post_title
。
值得指出的是,find
此自动生成的操作使用的调用将作用于所有模型对象,例如Post.find(:all, ...)
. 如果这不是您想要的行为(例如,如果想要Post
根据登录用户将搜索限制为 s 的特定子集),那么您必须在控制器中定义自己的auto_complete_for_[object]_[method]
操作。
Ruby on Rails 具有可用的原型框架。这个框架由Script.aculo.us使用,它提供了一个自动完成器控件,可以提供您正在寻找的功能。
您也可以尝试这种稍微手动的方法
# your_view.rhtml
<%= text_field 'contact', 'name', :id => 'suggest' %>
<div id='dropdown' style='display:none; z-index: 100; background: #FFFFFF'></div>
<script>
new Ajax.Autocompleter('suggest', 'dropdown', "<%= url_for :controller => 'contacts', :action => 'suggest_name' %>")
</script>
# contacts_controller.rb
def suggest_name
query_string = params[:contact][:name]
@contacts = Contact.find.all :conditions => ['name ilike ?', "%#{query_string}%"]
render :partial => 'name_suggestions'
end
# contacts/_name_suggestions.rhtml
<ul>
<% for contact in @contacts %>
<li><%= contact.name %></li>
<% end %>
</ul>
编辑:我将把这个答案留在这里作为一种理论参考点,但听起来自动完成器的答案可能对你更有用:)
免责声明:虽然我为 Google 工作(在各种 UI 中显然都有“建议”元素),但我没有查看过该领域的任何代码,甚至没有与任何人谈论客户端方面的问题。
服务器端语言在这里可能无关紧要。重要的一点是客户端所需的 AJAX。
我建议你有一个大约 1 秒的计时器(尝试找到一个最佳位置),每次用户在文本框中输入击键时都会重置它,如果用户离开文本框则取消。如果计时器触发,则使其触发 AJAX 请求。AJAX 请求将包含用户迄今为止键入的内容。AJAX 响应应该是建议列表和原始请求文本。
如果,当 AJAX 响应返回时,文本框中的文本仍然与响应中的字段相同(即用户此后没有键入)并且如果文本框仍然具有焦点,则提供一个下拉菜单。(必须有数百个关于 HTML 组合框的示例页面才能做到这一点。)
服务器所需要做的就是通过执行搜索和适当地格式化响应来响应 AJAX 请求——这比客户端容易得多!
希望对您有所帮助 - 很抱歉没有任何示例代码,但我怀疑它相当复杂,而且我并不是真正的 JavaScript 开发人员。
与 Rails 中的大多数事情一样,有几种方法可以做到这一点。Rails 曾经包含一组内置的自动完成帮助器,但现在该功能已被删除到 auto_complete 插件中。这可能是您获得想要实现的最简单的方法 - 控制器中的简单命令,视图中的一些简单内容 - ta-dah。要使用此解决方案,您只需将插件安装到您的应用程序中 - 请参阅此页面,该页面会告诉您安装和开始使用所需的所有知识。
正如另一个答案中所指出的,走这条路将利用与 Rails 捆绑在一起的原型和脚本 AJAX 框架。还有其他 AJAX 框架,尤其是 JQuery,也可以帮助您完成此功能,但您将有更多的学习来使用它们,而不仅仅是使用插件。