刚刚完成了教程,设置了所有内容。当我运行命令行测试时,似乎方法正在拾取正确的数据,但没有将它们保存到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">
如您所见,该方法选择所有正确的数据,但只保存nil。有人知道这可能有什么问题吗?
我能够重现这个问题。我使用rails 3.2.16和github的gem。两种设置似乎会导致这个问题。首先,您必须在application.rb:
中包含这一行。config.active_record.whitelist_attributes = true
另一个设置是
config.active_record.mass_assignment_sanitizer = :strict
如果你的环境文件中有上面的行,应用程序会在你试图用户时抛出异常。标记(article,:promote),因为gem没有将它的属性加入白名单。
我猜你没有严格的设置,因为没有它,应用程序的行为就像你的应用程序一样。它不会抛出异常,只是忽略这些值并保存带有空值的记录。(注意:虽然应用程序会给你一个这样的警告:
警告:不能批量分配受保护的属性:flaggable, flagger,原因
但在日志中很容易忽略这一点)。
现在,我们知道了问题是什么,我们可以试着解决它。无需修改gem中的任何内容,只需在应用程序中将true更改为false,就可以禁用whitelist_attributes。rb
然而,这不是一个适当的修复,只是一个解决方案,以显示它将如何工作,宝石应该照顾它自己的属性,它不应该要求你使用一个特定的设置为您的应用程序(例如。完全禁用whitelist_attributes