Rails 5 个参数/强参数问题

Rails 5 Params / Strong Params issue

我有一个接受参数列表的 RESTful API (ActionController::API) 服务。 RESTful 服务接受一个 JSON 正文请求(Content-Type 为 application/json)。当我调试 controller/action(在 action def 之后)并在参数列表中取峰值时,它显示如下:

<ActionController::Parameters {"given_name"=>"Mark", "subdomain"=>"development", "controller"=>"user", "action"=>"create", "user"=>{"given_name"=>"Mark"}} permitted: false>

编辑 所有请求都包含在其中(当它被传递给 controller/action——使用 POSTman):

{"given_name":"Mark"}

请注意,该对象包含两次 given_name 参数。这是正常行为吗?我没有将 "user" 对象(json 对象)传递给 controller/action?允许的标志是什么?

当我尝试使用时(现在我只是测试 RESTful 调用并分配用户对象将除外的任何值...尚未编程验证):

user = User.new(params)

我收到错误:

#<ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError>

所以,我到处寻找这背后的原因(为什么在参数列表中有一个 "user" 键?允许标志的目的是什么?为什么当我尝试分配参数)?

编辑

经过一些测试后,我将控制器名称从 "user_controller" 更改为 "tester_controller" 并将路由设置为指向重命名的控制器。

上面参数列表中的 "user" 对象似乎已更改为 "tester"。那么为什么参数列表包含一个 "object" 以及所有传递的带有控制器名称的参数?如果是这样,为什么需要它?

如有任何帮助,我们将不胜感激。

您不能将 params 传递给构造函数,因为 params 始终包含 :action:controller 键。新对象的属性应该放在哈希键下,以标识您要创建的模型,例如:user。我建议您参考 "Form Helpers" 指南的 rails guides, especially chapter 7

如果您想了解有关强参数的更多信息,rails 指南中也有 chapter :)

您需要指定哪些属性可以在控制器中进行批量分配。

def create
    @user = User.new(params.require(:user).permit(:given_name))
end

这可以防止恶意用户发出更改应用程序内部属性的请求帖子,例如 role 在用户对象的情况下。

如前所述,在参考strong parameters的指南中可以找到更好的解释。

默认情况下 Rails 在 API 模式下将 JSON 请求参数包装到一个散列中,从控制器 class 中猜测其名称。这就是为什么将控制器从 User 更改为 Tester 会更改 "object" 名称。您可以阅读详情 here.

因此,如果您的参数中不需要此 "object",只需从 config\initializers\wrap_parameters.rb 中的 :format 数组中删除 :json。或者您可以如上所述在控制器级别使用 fine-grained 控制。