我需要通过javascript将params传递回服务器。目前,我将它们传递给javascript:
sendParams("<%= params[:q].to_json %>");
然后像这样发送回来:
function sendParams(q){
$.ajax({
url: '/mymodel/myaction',
type: 'post',
data: {'q':q},
contentType: 'json'
});
}
在我的控制器中,我试着像使用任何其他参数一样使用它们:
MyModel.where(params[:q])
但即使萤火虫在POST标签中显示了这一点,这些参数仍然是空的:
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 #<String:0x686d0a8>
如何将JSON转换为params哈希?
答案 0 :(得分:6)
您的数据参数错误。
你有
data: {'q':q},
应该是
data: {q: 'q'},
答案 1 :(得分:5)
有一些问题需要解决才能实现。首先,q
没有作为参数发送到Rails,即使它是发布的。原因是因为它被视为JSON数据而不是参数。我通过删除行来修复此问题:
contentType: 'json'
之后,AJAX正确发送'q',但是Rails在JSON中使用它时遇到了麻烦。我不得不用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]))
这就是诀窍。