1

我在教育表格中有一个文本框,显示大学模型中大学名称的自动完成列表。我想要做的是防止用户添加新条目,即如果大学名称不在自动完成列表中,用户无法添加新名称但我不是能够做到这一点。如果用户键入的名称不在自动完成列表文本框中,则应清除

以下是我的教育/表格,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

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

4

1 回答 1

1

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

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

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

或者您可以检查提交时的参数(无论如何这样做都是一个好主意),以确保参数值包含在大学列表中。

另一点是,您似乎没有将学院 ID 传递给仅选择学院名称的选择 - 让自动完成功能同时返回学院的 ID 和名称将是一件痛苦的事情(也许看看https://github. com/crowdint/rails3-jquery-autocomplete)。

在更新和创建操作中,您必须使用提供的学院名称并在保存记录之前通过 College.find_by_name() 查找。可能通过使用 text_field_tag 大学名称来返回 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});
}); 

教育控制器.rb

*在创建和更新操作中

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

绝对有一种更清洁的方法可以做到这一点。

于 2012-05-09T09:46:44.577 回答