在向我的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" => {...}
答案 0 :(得分:2)
wrap_parameters
方法中有一个棘手的问题。您可以指定format
,但ParamsWrapper
从format
而不是request.content_mime_type
获取request.format
,所以如果您正在尝试{{1}请求,POST/PUT
格式为ParamsWrapper
而非multipart_form
。
所以而不是:
json
你必须这样做:
wrap_parameters format: [:json]