刚刚完成了教程,设置了所有内容。当我运行命令行测试时,似乎方法正在拾取正确的数据,但不会将它们保存到db中。
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">
正如您所看到的,该方法选择所有正确的数据,但只保存nils。 有谁知道这可能是什么问题?
答案 0 :(得分: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。
然而,这不是一个正确的解决方案,只是一个解决方法,以显示它如何工作,宝石应该照顾它自己的属性,它不应该要求你使用你的应用程序的特定设置(例如,完全禁用whitelist_attributes) )