【问题标题】:Strong Parameters in Rails - Require clause is being disregardedRails 中的强参数 - 忽略 Require 子句
【发布时间】:2018-11-18 12:34:43
【问题描述】:

简而言之,正在向 /games 发出 POST 请求。

即使强参数要求看起来像这样:

def game_params
  params.require(:game).permit(:name)
end

一个没有game 对象的json 请求,实际上只有一个name 字段。

{
    "name": "Game of Life"
}

更奇怪的是,rails 记录器实际上制作了一个游戏对象!日志看起来像

Parameters: { "name" => "Game of life", "game" => {"name" => "Game of life"}}

暗示正在创建游戏对象。如果传递的唯一参数是 not name,Rails 将正确抛出 400。

我读过的所有文档都表明 JSON 中的 game 对象是绝对必须的,但这里似乎被忽略了。

建议?

【问题讨论】:

  • 不清楚您是如何将 JSON 数据发送到 Rails 服务器的。你能提供你提出的整个请求 url、方法、数据、标题
  • 你能提供你的控制器方法吗?您实际上是在调用game_params,还是在您的控制器中有Game.create(name: params[:name]) 之类的东西?
  • @jdno 实际上调用游戏参数;非常奇怪的行为
  • 您确定没有在game: { name: "Game of life" } 中发送您的请求吗?对我来说最合乎逻辑的解释是您不小心将游戏包含在您的请求中,这解释了日志消息以及您没有收到错误的原因。因为你是对的,所以没有它应该有错误。
  • @jdno 绝对 100% 确定。我之前做过很多 Rails 项目,从来没有见过这样的事情。

标签: ruby-on-rails controller routing strong-parameters


【解决方案1】:

因此,为任何需要了解此内容的人提供更新。

经过一番挖掘,答案是——

如果你的 require 子句有一个与你的控制器名称匹配的对象名称,Rails 将使该对象成为可选的。您可以在初始化程序中关闭此行为。

来源:https://api.rubyonrails.org/v5.2.1/classes/ActionController/ParamsWrapper.html

【讨论】:

  • 很好的发现。我从未使用过参数包装,甚至不知道它存在。感谢您发布解决方案,这可能会在未来派上用场。
猜你喜欢
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
相关资源
最近更新 更多