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 控制。
我有一个接受参数列表的 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 控制。