这是我控制器中的一段代码:
@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 :(得分:0)
您是否尝试重新加载记录?我打赌你正在查看该文件的缓存版本。尝试:
@post.increment!(:views_count)
@post.reload
答案 1 :(得分:0)
我认为您使用该方法的方式没有任何问题。
当无法保存记录时,increment!
返回false。
我认为你可以尝试的一件事是将views_count属性初始化为0.我认为它当前可能是nil
而不是整数值。在nil
值上,您无法执行+=
运算符。
要初始化属性的值,请在db / migrate文件夹下找到该属性的迁移文件。
将属性代码修改为类似的内容。
t.integer :views_count, default: 0
或者如果您在创建表格时单独添加了列...
add_column :appropriate_model, :views_count, :integer, default: 0
答案 2 :(得分:0)
请注意,increment!
会调用update_attribute
,而save(:validate => false)
会调用before_*
。这会跳过验证,但the callback chain is still executed和:
如果任何before_ *回调返回false,则取消操作并且save返回false。
您的模型中是否定义了任何可能返回false但未在errors
中设置任何内容的{{1}}回调?