Rails:通过Ajax传递参数

10

我需要通过JavaScript将参数传递回服务器。目前,我是这样将它们传递到JavaScript中的:

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

然后像这样将它们发送回去:

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

在我的控制器中,我试图像处理其他参数一样使用它们:
MyModel.where(params[:q])

但是参数为空,尽管Firebug在“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转换为参数哈希表?


你能在development.log中显示请求和参数吗?我假设这是一个开发环境。 - manoj
好的发现。"q"在参数中根本没有出现。我假设它应该出现,即使它在post数据中? - nullnullnull
2个回答

6
你的数据参数有误。
你有:
data: {'q':q},

应该是这样的

data: {q: 'q'},

1
好的观点。虽然在我的情况下,我认为我应该不将第一个“q”放在引号中,但是我不应该将其放在引号中。 (这是我传递到函数中的参数。)不幸的是,尝试引用和未引用第二个q仍然无法正常工作。根据我的日志,某种原因导致q参数未被传递。 - nullnullnull

6

为了让这个工作,有几个问题需要解决。首先,即使它正在发布,q未被发送为参数到Rails。原因是它被视为JSON数据而不是参数。我通过删除以下行来解决了这个问题:

contentType: 'json'

之后,AJAX正确发送了“q”,但Rails在使用它时出现了问题,因为它是JSON格式的。我必须使用ActiveSupport :: JSON.decode解析它,但这会抛出一个 737:意外标记错误。经过(JSONlint)[http://jsonlint.com/]验证,发现所有引号都被转义了。

从这里开始,有两个解决方案。显然的解决方案是像这样使用 .html_safe :

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

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

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

这样就行了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接