ActiveRecord#增量!返回false,但没有错误

问题描述:

这里有一段代码在我的控制器:ActiveRecord#增量!返回false,但没有错误

@post.increment!(:views_count) # => false, record not saved, views_count is 0 
    @post.errors     # => is empty 
    @post.save!     # => true, views_count magically incremented to 1 

的问题是,如果没有#save!它没有真正的工作:记录没有更新,views_count是0.任何想法?

+0

您可以发布控制器代码的其余部分,至少是正在执行的操作以及可能的模型吗? – Brandan 2012-07-21 21:56:00

你试过重新加载记录吗?我敢打赌,你正在看文件的缓存版本。尝试:

@post.increment!(:views_count) 
@post.reload 

我不认为有什么不对您正在使用的方法的方式。

当记录无法保存时,increment!返回false。

我认为你可以尝试的一种可能的做法是将views_count属性初始化为0.我认为它当前可能是nil而不是整数值。并且在nil值上,您不能执行+=运算符。

要初始化某个属性的值,请在db/migrate文件夹下找到该属性的迁移文件。

将属性代码修改为像这样的东西。

t.integer :views_count, default: 0 

,或者如果你从表创建附加列单独分开......

add_column :appropriate_model, :views_count, :integer, default: 0 
+0

['increment'方法](http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-increment)的来源表明,如果属性值为'nil',则将属性值初始化为0 :'self [attribute] || = 0' – Brandan 2012-07-21 21:55:14

注意increment!电话update_attribute,进而调用save(:validate => false)。也就是说跳过验证,但the callback chain is still executed和:

如果任何before_的*回调返回false,操作取消,并保存返回false。

你有你的模型中定义的任何before_*回调可能被返回false,但在errors没有设置什么吗?