Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Rails 4强参数-处理缺少的模型参数哈希_Ruby On Rails 4_Strong Parameters - Fatal编程技术网

Ruby on rails 4 Rails 4强参数-处理缺少的模型参数哈希

Ruby on rails 4 Rails 4强参数-处理缺少的模型参数哈希,ruby-on-rails-4,strong-parameters,Ruby On Rails 4,Strong Parameters,型号: 帖子和用户 帖子属于:用户 用户有很多:帖子 简单 假设存在一些用户,我们访问编辑页面以获取帖子 <%= form_for @post do |f| %> 假设“编辑帖子”表单只有单选按钮作为字段 问题:引发ActionController::ParameterMissing异常。未找到参数:post 原因是从未创建Post params哈希,导致引发上述异常。例如,与空文本字段不同,空单选按钮不会触发要创建的模型参数散列 如果Post模型要求用户id有效怎么办?当然,有人

型号: 帖子和用户

帖子属于:用户
用户有很多:帖子

简单

假设存在一些用户,我们访问编辑页面以获取帖子

<%= form_for @post do |f| %>
假设“编辑帖子”表单只有单选按钮作为字段

问题:引发ActionController::ParameterMissing异常。未找到参数:post

原因是从未创建Post params哈希,导致引发上述异常。例如,与空文本字段不同,空单选按钮不会触发要创建的模型参数散列

如果Post模型要求用户id有效怎么办?当然,有人会想再次渲染视图,并说明无法保存帖子的原因

问题:在遵守Rails惯例的同时,处理这种情况的优雅方式是什么?

更新:


进一步的头脑风暴,我相信可能还有很多其他情况会产生这个问题;它不一定对应单选按钮。

这是我的即时解决方案。。。虽然这看起来有点傻,因为如果你清楚地在post控制器中并且你无论如何都需要post参数,那么为什么你必须检查post参数呢。看起来很违反直觉。这真的是最好的方法吗

  params.require(:post).permit(:user_id) if params[:post]

我有一个类似的问题,我不太喜欢这两个答案。在rails文档()中,我看到了以下解决方案:

params.fetch(:blog, {}).permit(:title, :author)
实际上,您提供了{}的默认值,这似乎足够好(至少在我的情况下)

应用于您的代码,您将拥有:

params.fetch(:post, {}).permit(:user_id)

我认为这相当干净,似乎在我的代码中起作用。

@ConnorLeech它起作用,因为最初的问题是没有创建params[:post],if只是在运行强params方法之前检查一下。如果参数根本不存在,该方法只返回nil。Nil在大多数(如果不是所有的话)模型更新方法中都有效,所以一切都有效。我不太喜欢它,因为如果post参数不存在(强参数的全部要点之一),应该抛出异常。根本没有发生的事情不是我所期望的行为。它需要在控制器中检查PARAM[[ POST ] ],以便进一步进行值PARAM[[ POST] ]::USER ID ]我有一个更奇怪的问题…我得到的参数与模型散列中找不到的参数相同,但我测试的是@user的一个表单_,它有两个user字段,就是这样。我的url碰巧使用了用户名,我会认为它缺少id或其他什么。但我的项目还有另一部分做同样的事情。唯一的区别是我从零开始构建这个表单,而不是通过脚手架…太棒了!这就是我一直在寻找的解决方案。谢谢你,保罗。你救了我的命。我还尝试使用Ben的解决方案,但它给了我一个错误:在分配属性时,必须将散列作为参数传递。
params.fetch(:blog, {}).permit(:title, :author)
params.fetch(:post, {}).permit(:user_id)