我在指令中有以下内容:
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个参数。有人可以解释为什么会出现这种行为吗?
答案 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
行来停用此功能。