如果输入的数据不在自动完成列表中,如何清空文本框

时间:2012-05-09 09:10:25

标签: javascript ruby-on-rails ruby-on-rails-3 validation autocomplete

我有一个教育形式的文本框,显示大学模型中大学名称的自动完成列表。我想做的是阻止用户添加新条目,即如果大学名称不在自动填充列表中,则用户无法添加新名称但是我无法执行此操作。如果用户类型名称不在自动填充列表中,则应清除文本框

以下是我的教育/表格,html.haml代码:

= f.label :college_id, "College<em>*</em><small>college name</small>".html_safe
= f.text_field :college_id
:javascript
$(document).ready(function() {   
    var a = ["abcd","abc"];
    $('#education_college_id').focus().autocomplete(#{colleges_names_arr});
}); 

在我的application_helper中,我编写了以下自动完成代码。

def colleges_names_arr(colleges=[])
req_colleges = College.all
colleges_names = req_colleges.collect{|col|col.full_name}.to_json
end

我应该写什么来阻止用户添加新数据和空文本框。

1 个答案:

答案 0 :(得分:1)

认为您需要Combobox示例而不是JQuery-UI自动完成的默认功能。

http://jqueryui.com/demos/autocomplete/#combobox

比简单文本框更复杂,因为它包含一些检查以确保输入文本包含来自提供列表的值(或用空格替换文本)。

或者您可以检查提交的参数(无论如何都要这样做)以确保参数值在大学列表中包含。

另外一点是,你似乎没有将学院ID传给选择只是学院名称 - 获得自动完成以返回学院的id和名称将是一个痛苦(可能看看{{3 }})。

在更新和创建操作中,您必须获取提供的College名称,并在保存记录之前通过College.find_by_name()查找。可能通过使用text_field_tag college_name返回params [:college_name](这将不依赖于教育形式的其余部分)然后像

_form.html.haml

= label_tag :college_name, "College<em>*</em><small>college name</small>".html_safe
= text_field_tag :college_name
:javascript
$(document).ready(function() {   
    var a = ["abcd","abc"];
    $('#college_name').focus().autocomplete(#{colleges_names_arr});
}); 

education_controller.rb

*在“创建和更新”操作

education = Education.create!(params)
college = College.find_by_name(params[:college_name])
if college
  education.college = college
end

这绝对是一种更清洁的方式。