首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 5 Params /强Params问题

Rails 5 Params /强Params问题
EN

Stack Overflow用户
提问于 2016-07-21 22:31:22
回答 3查看 7.1K关注 0票数 2

我有一个RESTful API (ActionController::API)服务,它接受一个params列表。RESTful服务接受JSON请求(包含内容类型的应用程序/json)。当我调试控制器/操作(就在动作def之后)并在params列表中出现峰值时,它显示如下:

代码语言:javascript
复制
<ActionController::Parameters {"given_name"=>"Mark", "subdomain"=>"development", "controller"=>"user", "action"=>"create", "user"=>{"given_name"=>"Mark"}} permitted: false>

编辑中包含的所有请求(当它被传递给控制器/操作时--使用POSTman):

代码语言:javascript
复制
{"given_name":"Mark"}

注意,该对象包含两次given_name参数。这是正常行为吗?我没有将"user“对象(json对象)传递给控制器/操作?允许的旗子是什么?

当我尝试使用(现在我只是测试RESTful调用和赋值用户对象将除.尚未列入验证程序):

代码语言:javascript
复制
user = User.new(params)

我知道错误:

代码语言:javascript
复制
#<ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError>

所以,我到处寻找这背后的原因(为什么在params列表中有一个“用户”键?)允许使用的旗帜的用途是什么?当我试图分配参数时,为什么会出现错误)?

编辑

在进行了一些测试之后,我将控制器名从"user_controller“更改为"tester_controller”,并设置指向重命名控制器的路由。

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

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-22 00:40:50

您需要指定哪些属性可用于控制器中的大量分配。

代码语言:javascript
复制
def create
    @user = User.new(params.require(:user).permit(:given_name))
end

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

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

票数 0
EN

Stack Overflow用户

发布于 2019-07-18 10:07:22

默认情况下,API模式下的Rails从控制器类将JSON请求参数封装到一个猜测其名称的散列中。这就是为什么将控制器从用户更改为Tester更改"object“名称的原因。您可以阅读详细信息这里

因此,如果您不需要在您的参数中使用这个“对象”,只需从:json中的:format数组中删除config\initializers\wrap_parameters.rb。或者,您也可以在控制器级别使用细粒度控制,如上文所述。

票数 3
EN

Stack Overflow用户

发布于 2016-07-21 23:28:02

您不能将params传递给构造函数,因为params总是包含:action:controller键。新对象的属性应该放在哈希键下面,以标识您想要创建的模型,例如:user。我建议你咨询导轨,特别是“表单助手”指南的第七章

如果您想了解更多关于强参数的知识,那么rails指南中也有一个第二章 :)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38515410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档