我有一个简单的服务,我用它来将数据发送到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工具中检查过)
我的控制器操作非常标准(过滤器之前也没有):
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键来自哪里?
答案 0 :(得分:3)
Rails会自动包装作为模型属性的参数。如果one
是规则模型的属性,则有效负载将如下所示:{"rule" => {"one" => "two"}}
此功能不再需要包含所有属性的顶级键。换句话说,如果attr1
和attr2
是MyModel
模型中的字段,则以下有效负载将被视为相同:
{ "mymodel" : { "attr1" : "val1", "attr2" : "val2" } }
{ "attr1" : "val1", "attr2" : "val2" }
可以在初始化程序中按控制器或应用程序范围禁用此功能。有关详细信息,请查看此答案:Rails 3 params unwanted wrapping