我正在使用我的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字符串。任何想法下一步该做什么?
答案 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'}}