$ http服务添加不需要的JSON密钥来请求数据

时间:2015-04-29 16:37:01

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

我有一个简单的服务,我用它来将数据发送到Rails控制器。

我的服务看起来像这样:

app.service('autoRulesService', function($http) {
  return({
    createRule: createRule
  });

  function createRule() {
    var request = $http({
      method: 'POST',
      url: '/rules.json',
      data: { one: 'two }
    });

    return request.then(handleSuccess, handleError);
  }

  function handleSuccess() {
    // body omitted...
  }
  function handleError() {
    // body omitted...
  }
});

我以非常标准的方式在我的控制器中使用该服务:

$scope.saveRule = function() {
  rulesService.createRule().then(function() {
    // do stuff...
  });
}

问题是当我检查Rails日志中发送的数据时,我的参数中出现了一个奇怪的不需要的密钥。 "rule"参数来自哪里?

Processing by AutoAnalysis::RulesController#create as JSON
   Parameters: {"one"=>"two", "rule"=>{}}

它没有出现在请求有效负载中(在Chrome Dev工具中检查过)

request payload

我的控制器操作非常标准(过滤器之前也没有):

class RulesController < ApplicationController
  def create
    # NOTE: I'm referencing an :auto_analysis_rule parameter here because 
    # that's my desired param key name. It doesn't exist in the request
    # as shown here.
    render json: Rule.create(params[:auto_analysis_rule])
  end
end

我无法提及$http从网址或任何in the docs推断根JSON密钥。

"rule" param键来自哪里?

1 个答案:

答案 0 :(得分:3)

Rails会自动包装作为模型属性的参数。如果one是规则模型的属性,则有效负载将如下所示:{"rule" => {"one" => "two"}}

此功能不再需要包含所有属性的顶级键。换句话说,如果attr1attr2MyModel模型中的字段,则以下有效负载将被视为相同:

{ "mymodel" : { "attr1" : "val1", "attr2" : "val2" } }

{ "attr1" : "val1", "attr2" : "val2" }

可以在初始化程序中按控制器或应用程序范围禁用此功能。有关详细信息,请查看此答案:Rails 3 params unwanted wrapping