wrap_parameters在application =>中添加参数{...}哈希

时间:2016-03-07 11:40:27

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

在向我的rails webapp发出POST / PATCH请求时,我将数据作为json发送。例如,这个json数据{"name" => "Hallo", "status" => "admin"}到名为UsersController的控制器。 wrap_parameters.rb文件中wrap_parameters的设置是默认值:

ActiveSupport.on_load(:action_controller) do
  wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
end

所以每个json数据都包含这个"user" => {"name"=> "Hallo", "status" => "admin"}。这应该是这样的。但是当我调用一个名为status的自定义方法(位于ApplicationController中)来检查服务器状态时,所有后续请求json数据都不会被包含在他们的控制器/模型名称哈希中,但是在这样的哈希中{{1} }。

这是针对所有后续请求,直到我重新启动服务器。此外,如果我想保持"正确"行为我不能再次在ApplicationController中调用status方法,这会导致"application" => {"name"=> "Hallo", "status" => "admin"}包装。

我发现当我为status请求设置Content-Type = text / html(以前是Content-Type = application / json)时,以下请求没有被污染,这意味着我得到了正确的包装行为。

然而,这非常令人不安,因为有人只需要调用status方法,当为请求设置Content-Type = application / json并且以下所有POST / PATCH请求都不再工作时。

我不知道这是否重要,但我在routes.rb中设置了以下内容:

"application" => {...}

1 个答案:

答案 0 :(得分:2)

wrap_parameters方法中有一个棘手的问题。您可以指定format,但ParamsWrapperformat而不是request.content_mime_type获取request.format,所以如果您正在尝试{{1}请求,POST/PUT格式为ParamsWrapper而非multipart_form

所以而不是:

json

你必须这样做:

wrap_parameters format: [:json]

来源:https://github.com/rails/rails/blob/dda31d59a03adb7e5aa372e72bb66a3886632f2f/actionpack/lib/action_controller/metal/params_wrapper.rb#L281