Rails:通过Ajax传递Params

我需要通过javascript将params传递回服务器。 目前,我将它们传递给javascript,如下所示:

sendParams(""); 

然后像这样发送回来:

 function sendParams(q){ $.ajax({ url: '/mymodel/myaction', type: 'post', data: {'q':q}, contentType: 'json' }); } 

在我的控制器中,我试着像使用任何其他参数一样使用它们:

 MyModel.where(params[:q]) 

但即使firebug在POST标签中显示了这个内容,params仍然是空的:

 q=%7B%26quot%3Bc%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Ba%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bname%26quot%3B%3A%26quot%3Btitle%26quot%3B%7D%7D%2C%26quot%3Bp%26quot%3B%3A%26quot%3Bcont%26quot%3B%2C%26quot%3Bv%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bvalue%26quot%3B%3A%26quot%3B2%26quot%3B%7D%7D%7D%7D%2C%26quot%3Bs%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bname%26quot%3B%3A%26quot%3Bvotes_popularity%26quot%3B%2C%26quot%3Bdir%26quot%3B%3A%26quot%3Bdesc%26quot%3B%7D%7D%7D 

知道为什么这些信息没有被where子句处理? 我该怎么做才能使params Rails再次可读?

更新:

 Started POST "/publications/search?scroll=active&page=6" for 127.0.0.1 at 2013-0 2-12 22:55:24 -0600 Processing by PublicationsController#index as */* Parameters: {"scroll"=>"active", "page"=>"6"} 

更新2:

问题显然源于contentType 。 当我删除它,然后q作为Rails参数发送。 不幸的是, q仍然是JSON,导致错误:

 undefined method `with_indifferent_access' for # 

如何将JSON转换为params哈希?

您的数据参数错误。

你有

 data: {'q':q}, 

它应该是

 data: {q: 'q'}, 

为此,需要解决几个问题。 首先, q并没有作为参数发送到Rails,即使它是发布的。 原因是因为它被视为JSON数据而不是参数。 我通过删除该行来修复此问题:

 contentType: 'json' 

在那之后,AJAX正确地发送了’q’,但是Rails在JSON中使用它时遇到了麻烦。 我不得不用ActiveSupport::JSON.decode解析它, ActiveSupport::JSON.decode了一个737: unexpected token错误。 我通过(JSONlint)[http://jsonlint.com/]运行代码,结果发现所有的引号都已被转义。

从那里,有两个解决方案。 显而易见的是使用.html_safe如下所示:

 sendParams("<%= params[:q].to_json.html_safe %>"); 

但是当用户输入引号时,这会引起问题。 更安全的替代方法是在将转义后的HTML实体传回Rails之后对其进行解码,如下所示:

 ActiveSupport::JSON.decode(CGI.unescapeHTML(params[:q])) 

这就是诀窍。