这是我控制器中的一段代码:
@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。有什么想法吗?
您是否尝试过重新加载记录?我敢打赌您正在查看该文件的缓存版本。尝试:
@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
请注意,increment!
调用 update_attribute
,而 又调用 save(:validate => false)
。这将跳过验证,但仍会执行回调链,并且:
如果任何 before_* 回调返回 false,则操作将被取消,保存返回 false。
您的模型中是否定义了任何可能返回 false 但不errors
设置任何内容的before_*
回调?