$ http.get搞乱JSON参数

时间:2015-01-29 02:31:45

标签: json angularjs ruby-on-rails-4 params

我正在使用我的AngularJS应用程序来管理我的Rails API。 一切都很好,正常,直到我必须在GET请求中发送参数。这是Rails控制器

def cats
  if cat_params[:color]
    @cats = Cat.where(... #you know
  else
    //Do something else
  end

private
  def cat_params
    params.require(:cat).permit(:color)
  end

然后来自Angular

 var kitty = {
   cat: {
     color: "red"
   }
 }
 $http.get('some URL', { params: kitty }).success.....

此时,params哈希看起来像stringify JSON

Started GET "some URL?cat=%7B%22color%22:%22red%22%7D" for 127.0.0.1 at 2015-01-28 23:10:24 -0300
Processing by Some_controller as JSON
  Parameters: {"cat"=>"{\"color\":\"red\"}", "cat_id"=>"19"}
  Cat Load (0.5ms)  SELECT  "cat".* FROM "cats"  WHERE "cat"."id" = 19 LIMIT 1
  {"cat"=>"{\"color\":\"red\"}", "format"=>"json", "controller"=>"some_controller", "action"=>"some_action", "cat_id"=>"19"}
Completed 500 Internal Server Error in 95ms

NoMethodError - undefined method `permit' for "{\"cat\":\"red\"}":String:

我也发送了Content-Type标头,设置为'application/json'。 从Angular的$ http.get文档中,我读到如果params的值不是字符串,它将字符串化JSON对象,因此问题不在前端。

我认为解决方案不是从启动JSON解析params哈希开始的,因为我过去没有必要这样做。在我看来strong_parameters正在玩脏,或者Rails忽略了JSON字符串。任何想法下一步该做什么?

2 个答案:

答案 0 :(得分:2)

我刚遇到同样的问题。更改param serializer为我解决了问题:

$http.get('someURL', {
  paramSerializer: '$httpParamSerializerJQLike',
  params: {cat: {color: 'red}}
})

同时添加'Content-Type': 'application/json'标题也无济于事,因为它适用于请求的正文。

答案 1 :(得分:0)

我曾经遇到过$http.get问题,当调用$http.get('some url', {params:SOME_PARAMS})时,SOME_PARAMS可以转换为键值参数,因为它是一个简单的键值数据,如{{1}当它是像{color:'red'}这样的复杂类型时,它会将params转换为json字符串。

所以为了解决你的问题,我建议在url后添加params,如:

{cat:{color:'red'}}