2011-04-06 35 views
1

我想在我的Rails应用程序中使用Jquery-UI自动完成。在我的application.js中的我也行为什么自动完成不发送JSON请求

$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

什么是$ j('#autocomplete')?它是$('#autocomplete')?还有一些萤火虫的错误呢? – 2011-04-06 16:51:38

+0

对不起,我不得不使用'var $ j = jQuery.noConflict();'因为我也使用原型。在萤火虫没有错误。 – Teddy 2011-04-06 19:49:12

+1

您是否尝试过使用Fiddler或Wireshark之​​类的东西来确保将请求发送到服务器?而且,什么样的反应回来了? – 2011-04-11 15:16:45

回答

1

经过围绕intrawebz的大量搜索之后,我意识到我正在犯一些小的严重错误。 我改的第一件事就是把JavaScript插入$j(document).ready(function(){,以便它现在读取

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

真的不知道为什么这样做了区别,也许有人可以告诉我。

我这样做后,我看到它正确地将json请求发送到服务器并接收回来的东西,但没有任何东西被放入自动完成菜单。从这一点我意识到,jQuery UI自动完成填充菜单中的序列化对象的属性称为“价值”。我的模型没有这个属性。我通过在我的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项目工作,而无需链接自己不具有的一切,我会喜欢的功能插件后。

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服务喜欢在识别li时设置属性名称d数据。因此,为什么在我的响应函数中,我引用了像msg.d.也许在红宝石,你可以做味精。

编辑 我忘记提及的一件事是,我的示例使用多值文本框,这意味着我试图在文本框上使用多个条目的自动完成,即文本框可以包含09, abc