2013-02-13 69 views
9

我需要将params通过javascript传递回服务器。目前,我将它们传递到JavaScript像这样:Rails:通过Ajax传递参数

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

然后送他们回到这样的:

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

在我的控制,我尝试使用它们就像我其他任何PARAMS:

MyModel.where(params[:q]) 

但PARAMS陆续返回空,即使萤火显示了这个在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再次可读?

UPDATE:

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

你可以显示请求和在development.log中记录的参数吗?我认为这是一个开发环境。 – manoj 2013-02-13 05:04:54

+0

好的。 “q”没有出现在参数中。我假设它应该,即使它在后数据? – nullnullnull 2013-02-13 05:09:44

回答

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 %>"); 

但这引起的问题,当用户inputed报价。更安全的替代方案是,在将它们传回到Rails之后解码已转义的HTML实体,如下所示:

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

这样做的确有用。

6

您的数据参数错误。

你有

data: {'q':q}, 

应该

data: {q: 'q'}, 
+1

好点。我不应该把第一个'q'放在引号中,虽然在我的情况下,我想我应该离开第二个q不加引号。 (这是我传入函数的一个参数。)不幸的是,尝试引用和不引用的第二个q仍然不起作用。根据我的日志,由于某种原因,q参数没有通过。 – nullnullnull 2013-02-13 13:13:07