【问题标题】:rails gem Make_flaggable doesn't save to dbrails gem Make_flaggable 不保存到数据库
【发布时间】:2014-03-12 20:26:24
【问题描述】:

刚刚完成了教程,设置好了一切。当我运行命令行测试时,似乎方法正在获取正确的数据,但没有将它们保存到数据库中。

irb(main):009:0> u.flag(s, :promote)
  MakeFlaggable::Flagging Load (0.0ms)  SELECT "flaggings".* FROM "flaggings" WHERE "flaggings"."flagger_id" = 2 AND "flaggings"."flagger_type" = 'User' AND "flaggings"."flaggable_type" = 'Scribble' AND "flaggings"."flaggable_id" = 48 AND "flaggings"."flag" = 'promote' LIMIT 1
   (0.0ms)  BEGIN
  SQL (0.0ms)  INSERT INTO "flaggings" ("created_at", "flag", "flaggable_id", "flaggable_type", "flagger_id", "flagger_type", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["created_at", Wed, 12 Mar 2014 20:15:45 UTC +00:00], ["flag", nil], ["flaggable_id", nil], ["flaggable_type", nil], ["flagger_id", nil], ["flagger_type", nil], ["updated_at", Wed, 12 Mar 2014 20:15:45 UTC +00:00]]
   (12.0ms)  COMMIT
=> #<MakeFlaggable::Flagging id: 10, flaggable_type: nil, flaggable_id: nil, flagger_type: nil, flagger_id: nil, flag: nil, created_at: "2014-03-12 20:15:45", updated_at: "2014-03-12 20:15:45">

如您所见,该方法选择所有正确的数据,但只保存 nil。 有谁知道这可能是什么问题?

【问题讨论】:

  • 我遇到了同样的问题,一直没能解决。
  • 我真的很想解决它:)
  • 如果几天内没有人回答,我会悬赏。
  • 我也在 github 和 cmets 的视频教程上问过,也许 gem 的开发者之一会愿意帮忙。
  • 你用的是什么版本?你能分享整个项目吗(我想这只是教程)或者至少是 Gemfile。因为您的项目生成的 SQL 不同于您可以在新项目中获得的 SQL:SELECT "flaggings".* FROM "flaggings" WHERE "flaggings"."flagger_id" = 1 AND "flaggings"."flagger_type" = 'User' AND "flaggings"."flaggable_type" = 'Article' AND "flaggings"."flaggable_id" = 1 LIMIT 1。有些东西正在将AND "flaggings"."flag" = 'promote' 与条件混合在一起。

标签: ruby-on-rails postgresql ruby-on-rails-3 voting-system


【解决方案1】:

我能够重现该问题。我使用了 rails 3.2.16 和来自 github 的 gem。 两个设置似乎导致了问题。 首先,您必须在 application.rb 中有这一行:

config.active_record.whitelist_attributes = true

另一个设置是

config.active_record.mass_assignment_sanitizer = :strict

如果您的环境文件中有上述行,当您尝试 user.flag(article, :promote) 时,应用程序会抛出异常,因为 gem 没有将其属性列入白名单。

我猜你没有严格的设置,因为没有它,应用的行为就像你的应用一样。它不会抛出异常,只是忽略值并使用空值保存记录。 (注意:虽然应用程序应该给你这样的警告:

警告:无法批量分配受保护的属性:flaggable、flagger、 原因

但很容易在日志中遗漏)。

现在,我们知道似乎是什么问题,我们可以尝试解决它。 无需更改 gem 中的任何内容,您可以通过在 application.rb 中将 true 更改为 false 来禁用 whitelist_attributes

但这不是一个正确的解决方法,只是一个展示它如何工作的解决方法,gem 应该注意它自己的属性,它不应该要求你为你的应用程序使用特定的设置(例如,完全禁用 whitelist_attributes )

【讨论】:

  • 谢谢,今晚回家后我会试试临时修复方法
  • 不幸的是,先生,我仍然得到相同的结果。白名单一直是假的,这就是为什么没有得到批量分配错误的原因。 :strict 就在那里。使用 whitelist = false 它保存一个空集。
  • 嗯,那很奇怪。我很确定我写的内容与您的问题有关。这是有道理的。您能否发布您的 Gemfile、Gemfile.lock 以便我检查确切的版本?
  • 您能否也尝试将白名单更改为 true,看看您是否有与我在上面发布的相同的警告/错误?
  • 好的,但是对于相同的 3 个属性(可标记、标记、原因)?或者除了这些还有什么?
猜你喜欢
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多