我有一个教育形式的文本框,显示大学模型中大学名称的自动完成列表。我想做的是阻止用户添加新条目,即如果大学名称不在自动填充列表中,则用户无法添加新名称但是我无法执行此操作。如果用户类型名称不在自动填充列表中,则应清除文本框
以下是我的教育/表格,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
我应该写什么来阻止用户添加新数据和空文本框。
答案 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
这绝对是一种更清洁的方式。