【问题标题】:Strong parameters in Rails - automatically adding in migrationRails 中的强参数 - 在迁移中自动添加
【发布时间】:2014-06-24 20:21:10
【问题描述】:

在更新了我的新数据库的大约 15-20 个条目后,我意识到我的数据没有更新。我刚刚阅读了 Rails 4.0 中的强参数,结果发现我没有将它们列入白名单。我理解拥有它们的原因(尽管我完全不同意它创建的工作流程)。

基本上,我在创建应用程序时的工作流程是创建具有一些属性的脚手架模型。我通常需要更新(添加到)这个模型,因为我意识到需要新的属性。我使用以下迁移来做到这一点:

rails g migration AddThisNewAttributeToProduct this_new_attribute:string

但我今天了解到,这样做不会自动添加到强参数列表中,基本上如果我在表单中使用它,它不会保存到数据库中。最糟糕的是,我没有收到任何警告或任何东西!

因为我很可能会在以后添加参数时忘记更新强参数列表,所以我最终会一遍又一遍地这样做(即尝试使用表单更改数据而不将其保存到数据库中) .

所以,我很困惑如何解决这个问题:

  1. 有没有办法在使用迁移向模型添加属性时,自动将属性添加到强参数列表中?

  2. 有没有办法在开发模式下禁用强参数白名单?

  3. 可以在登录管理员时禁用它吗?

  4. (重要)如果我尝试更改不在白名单中的属性,至少可以使应用程序崩溃吗?所以我被提醒添加它?几乎与 attr_accessible 过去的工作方式相同。

【问题讨论】:

  • 当您从form 传递字段blah-blah 并且没有在控制器中将其列入白名单时,您肯定会在日志中收到警告Unpermitted parameters: blah-blah
  • 这很奇怪,我认为在尝试创建具有未列入白名单的属性的批量分配记录时会出现ActiveModel::ForbiddenAttributesError 错误。编辑:实际上,那是你不允许任何我认为的时候,否则,正如 Kirti 所说,你会得到 Unpermitted parameters: password 例如。
  • 如果你真的想要你可以使用params.require(:product).permit!将整个参数哈希列入白名单,但你应该非常确定你想要这样做。我个人不建议这样做,并将其视为验收测试的一部分,以确保正确创建/更新表单上的新/修改数据。
  • 格雷姆,这确实奏效了!在开发过程中这样做会很棒,然后我可以在生产中修复它。它会让事情变得容易得多。谢谢!

标签: ruby-on-rails strong-parameters


【解决方案1】:

1.有没有办法在使用迁移向模型添加属性时,自动将属性添加到强参数列表中?

否。它们会自动为您添加,以防您生成脚手架

2.有没有办法在开发模式下禁用强参数白名单?

不可以。您不能禁用它。这是一件好事,你真的不想那样做。 与批量分配漏洞作斗争是有益的。

3.登录管理员时可以禁用它吗?

不。请阅读我在 #2 上的 cmets。

4. (重要)如果我尝试更改不在白名单中的属性,至少可以使应用程序崩溃吗?所以我被提醒 添加它?与 attr_accessible 过去的工作方式差不多。

当您从表单传递字段 blah_blah 并且没有在控制器中将其列入白名单时,您肯定会在日志中收到警告 Unpermitted parameters: blah_blah

您甚至可以分别检查在创建/更新 createupdate 操作的记录时生成的查询,以查看哪些字段实际保存在数据库中,哪些字段丢失了。

日志将在您运行rails server 的终端上可用。您可以在 application_folder/log 目录中的环境特定日志文件中找到它们。因此,如果您在development 中,您可以在log 目录中查看development.rb

【讨论】:

  • 这真的很糟糕。我的意思是,我知道这是一个安全问题,但不能在开发模式下禁用它没有任何意义。如果我在笔记本电脑上创建应用程序并使用表单通过编辑功能更新模型,则完全没有风险,应该可以禁用!
  • 我的第二个想法是其他人都有什么样的工作流程来更新数据。我的意思是,如果您在迁移中添加属性/列,那么不将其包含在白名单中的原因是什么?警告并没有真正帮助我,因为如果我不记得将新添加的属性添加到白名单中,我也不会记得在更新时仔细检查日志。
  • 最后,我忘了说谢谢你的明确回答!顺便说一句,当它发生时是否有可能捕捉到这个警告并使应用程序崩溃(所以我会注意到它?)?
【解决方案2】:
  1. 不,rails 迁移不会这样做。最好的办法是编写一个为您执行此操作的脚本,但这不值得。

  2. 一般的经验法则是keep dev env as similar as prod env,所以这是个坏主意。理论上,您可以使用一些条件来检查Rails.env == "production"Rails.env == "development" 来运行一段代码,使用prod 中的强参数并在attr_accessible 之后使用Rail3 编写属性的方式,但话又说回来,这最终会变得非常丑陋代码。

  3. 这与一个人是否以管理员身份登录无关。

  4. 当您尝试保存强参数中未列出的某些属性时,您会在日志中看到 Unpermitted parameters: attr_name

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2017-02-17
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多