我正在尝试在我的rails应用程序中使用Jquery-UI自动填充。在我的application.js里面,我有一行
$j('#autocomplete').autocomplete({
source:'contexts/1.json'
});
根据我在文档中阅读的内容,函数需要返回json数据,所以在我的context_controller Show方法中我有以下内容
def show
@context = Context.find(params[:id])
if params[:term]
@tags = Tag.find(5, :conditions => ['name LIKE ? AND context_id = ?',params[:q], @context.id])
else
@tags = Tag.find(:all, :conditions => ["context_id = ?",@context.id])
end
respond_to do |format|
format.html
format.json { render :json => @tags}
end
端
问题是,当我开始输入附加了自动完成功能的输入框时,服务器似乎没有收到请求。我怎样才能做到这一点?
答案 0 :(得分:1)
在对intrawebz进行了大量搜索之后,我意识到我正在制作一些小的关键错误。
我改变的第一件事是将javascript放入$j(document).ready(function(){
,以便它现在读取
$j(document).ready(function() {
$j('#autocomplete').autocomplete({
source: '/contexts/1'
});
});
不确定为什么这会产生影响,也许有人可以告诉我。
在我这样做后,我看到它正确地将json请求发送到服务器并接收回来但没有任何内容被放入自动完成菜单。从这一点开始,我意识到jQuery UI自动完成在菜单中填充了序列化对象的属性“value”。我的模型没有这个属性。我通过在我的Tag.rb模型文件中添加“value”的方法(虚拟属性)来解决这个问题。并更改了我的控制器,以便它将与对象一起返回“value”属性。
format.json { render :json => @tags.to_json(:methods=>:value)}
虽然我现在有一个带有'value'属性的序列化对象,但它仍然无效。我必须采取的最后一步是让.to_json()方法不返回作为根的对象类型。这可以在config / initializers / new_rails_defaults.rb
中找到 ActiveRecord::Base.include_root_in_json = false
在完成所有这些之后,我能够自动完成在我的rails项目中工作,而不会将自己链接到一个没有我喜欢的所有功能的插件。
答案 1 :(得分:0)
在javascript方面,这是我过去使用的示例。请记住,这是查询.NET WCF服务,但从JavaScript的角度来看,它应该无关紧要。
'#autocomplete'是一个简单的html文本框
function split(val) {
return val.split(/,\s*/);
}
function extractLast(term) {
return split(term).pop();
}
$('#autocomplete').autocomplete({
source: function (request, response)
{$.getJSON("URLThatReturnsJSON", {
name: extractLast(request.term),
context_id: $('.context_id').val()
}, function (msg) {
return response(msg.d);
});
}
以下是发送到服务器的示例..(08是自动填充文本框中的某个示例) http://localhost/URLThatReturnsJSON?name=08&context_id=1
以下是回来的样本 { “d”:[ “0008”, “0827”, “0849”, “0866”, “0882”, “0804”]}
出于安全原因,WCF服务喜欢在识别数据列表时设置属性名称d。因此我在我的响应函数中引用的原因就像msg.d.也许在红宝石中,你可以做一下消息。
编辑 我忘记提到的一件事是我的示例使用多值文本框,这意味着我正在尝试对文本框中的多个条目使用自动完成,即文本框可以包含,09,bill,abc