为什么自动完成不发送JSON请求

时间:2011-04-06 15:49:46

标签: ruby-on-rails jquery-ui autocomplete

我正在尝试在我的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

问题是,当我开始输入附加了自动完成功能的输入框时,服务器似乎没有收到请求。我怎样才能做到这一点?

2 个答案:

答案 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