angular http post为请求添加了额外的参数

时间:2014-06-26 15:36:51

标签: javascript jquery ruby-on-rails angularjs

我在指令中有以下内容:

scope.progressCourse = ->
  req_data =
    course_id: scope.course.id
    success: true

  $http.post(
    "<%= Rails.application.routes.url_helpers.progress_course_path %>",
    req_data
  ).then (succesful_resp) ->
    scope.course = succesful_resp.data.data
    scope.init_from_course_object()
  , (error_resp) ->
    show_error(error_resp)

而且,服务器端,我希望收到course_id和成功参数。但是,我收到了额外的东西:

  Parameters: {"course_id"=>1, "success"=>true, "training"=>{"course_id"=>1, "success"=>true}}

请求发送到名为TrainingController的控制器。我运行Rails 3.2.13,角度为1.2.10。有人可以解释为什么额外的哈希出现{"training"=>{"course_id"=>1, "success"=>true}}

更新: 如果我加上这个:

  $httpProvider.defaults.transformRequest = (data) ->
    if data?
      return $.param(data)
    return data

我将帖子更改为:

  $http(
    method: "POST"
    url: "<%= Rails.application.routes.url_helpers.progress_course_path %>",
    data: req_data,
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
  ).then (succesful_resp) ->

然后我只得到我需要的2个参数。有人可以解释为什么会出现这种行为吗?

1 个答案:

答案 0 :(得分:1)

Rails具有许多内置功能,可以更轻松地处理外部API。在这种情况下,它有一个 params_wrapper ,它将操作在请求中传入的参数,将它们嵌套在它假定你想要的散列中。

例如,如果您将{name: 'foo', age: 12}提交给UsersController,它将假定它们应该用嵌套的user键包装,并且会透明地为您执行此操作。

此包装器的文档位于:

http://api.rubyonrails.org/v3.2.13/classes/ActionController/ParamsWrapper.html

代码在这里:

https://github.com/rails/rails/blob/v3.2.13/actionpack/lib/action_controller/metal/params_wrapper.rb

如果您不想使用此功能,可以在wrap_parameters format: [:json]中注释掉/config/initializers/wrap_parameters.rb行来停用此功能。