【问题标题】:Why is autocomplete not sending a JSON request为什么自动完成不发送 JSON 请求
【发布时间】:2011-07-30 23:15:00
【问题描述】:

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

结束

问题是,当我开始在自动完成附加到的输入框中输入内容时,服务器似乎没有收到请求。我怎样才能使这项工作?

【问题讨论】:

  • 什么是 $j('#autocomplete')?是 $('#autocomplete') 吗?还有一些萤火虫或其他东西的错误呢?
  • 对不起,我不得不使用 'var $j = jQuery.noConflict();'因为我也使用原型。 firebug 中没有错误。
  • 您是否尝试过使用 Fiddler 或 Wireshark 之类的工具来确保将请求发送到服务器?而且,会得到什么样的回应?
  • 您的页面上是否有带有 id="autocomplete" 的文本框?

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


【解决方案1】:

在对 intrawebz 进行大量搜索后,我意识到我犯了一些小的严重错误。 我更改的第一件事是将javascript放入$j(document).ready(function(){,以便它现在读取

$j(document).ready(function() {
  $j('#autocomplete').autocomplete({
    source: '/contexts/1'
  });
});

不太清楚为什么这会有所不同,也许有人可以告诉我。

在我这样做之后,我看到它正确地将 json 请求发送到服务器并收到了返回的内容,但自动完成菜单中没有任何内容。从这一点上,我意识到jQuery UI 自动完成在菜单中填充了名为“值”的序列化对象的属性。我的模型没有这个属性。我通过在我的 Tag.rb 模型文件中添加一个“值”的方法(虚拟属性)来解决这个问题。并更改了我的控制器,以便它将“值”属性与对象一起返回。 format.json { render :json => @tags.to_json(:methods=>:value)}

虽然我现在有一个带有“值”属性的序列化对象,但它仍然无法正常工作。我必须采取的最后一步是让 .to_json() 方法不返回对象的类型作为根。这可以在 config/initializers/new_rails_defaults.rb 中找到

ActiveRecord::Base.include_root_in_json = false

在所有这些之后,我能够在我的 rails 项目中使用自动完成功能,而无需将自己链接到一个插件,该插件没有我想要的所有功能。

【讨论】:

    【解决方案2】:

    在 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 之类的原因。也许在 ruby​​ 中,你可以只做 msg。

    编辑 我忘了提到的一件事是我的示例使用了一个多值文本框,这意味着我正在尝试对文本框上的多个条目使用自动完成功能,即文本框可以包含 09、bill、abc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2011-04-20
      • 2012-02-10
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多