我有一个RESTful API (ActionController::API)服务,它接受一个params列表。RESTful服务接受JSON请求(包含内容类型的应用程序/json)。当我调试控制器/操作(就在动作def之后)并在params列表中出现峰值时,它显示如下:
<ActionController::Parameters {"given_name"=>"Mark", "subdomain"=>"development", "controller"=>"user", "action"=>"create", "user"=>{"given_name"=>"Mark"}} permitted: false>编辑中包含的所有请求(当它被传递给控制器/操作时--使用POSTman):
{"given_name":"Mark"}注意,该对象包含两次given_name参数。这是正常行为吗?我没有将"user“对象(json对象)传递给控制器/操作?允许的旗子是什么?
当我尝试使用(现在我只是测试RESTful调用和赋值用户对象将除.尚未列入验证程序):
user = User.new(params)我知道错误:
#<ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError>所以,我到处寻找这背后的原因(为什么在params列表中有一个“用户”键?)允许使用的旗帜的用途是什么?当我试图分配参数时,为什么会出现错误)?
编辑
在进行了一些测试之后,我将控制器名从"user_controller“更改为"tester_controller”,并设置指向重命名控制器的路由。
上面的params列表中的"user“对象似乎已经更改为"tester”。那么,为什么param列表包含一个"object“,所有传递的参数都带有控制器的名称?如果是这样的话,为什么需要它呢?
任何帮助都将不胜感激。
发布于 2016-07-22 00:40:50
您需要指定哪些属性可用于控制器中的大量分配。
def create
@user = User.new(params.require(:user).permit(:given_name))
end这可以防止恶意用户发布更改应用程序内部属性的请求帖子,比如用户对象的情况下的role。
如前所述,更好的解释可以在参考强参数的指南中找到。
发布于 2019-07-18 10:07:22
默认情况下,API模式下的Rails从控制器类将JSON请求参数封装到一个猜测其名称的散列中。这就是为什么将控制器从用户更改为Tester更改"object“名称的原因。您可以阅读详细信息这里。
因此,如果您不需要在您的参数中使用这个“对象”,只需从:json中的:format数组中删除config\initializers\wrap_parameters.rb。或者,您也可以在控制器级别使用细粒度控制,如上文所述。
发布于 2016-07-21 23:28:02
您不能将params传递给构造函数,因为params总是包含:action和:controller键。新对象的属性应该放在哈希键下面,以标识您想要创建的模型,例如:user。我建议你咨询导轨,特别是“表单助手”指南的第七章。
如果您想了解更多关于强参数的知识,那么rails指南中也有一个第二章 :)
https://stackoverflow.com/questions/38515410
复制相似问题