0

这是我的控制器中的一段代码:

  @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。有什么想法吗?

4

3 回答 3

0

注意increment!来电update_attribute,而后者又来电save(:validate => false)。这会跳过验证,但回调链仍在执行,并且:

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

您的模型中是否定义了任何before_*可能返回 false 但未设置任何内容的回调errors

于 2012-07-21T22:16:02.660 回答
0

您是否尝试过重新加载记录?我敢打赌,您正在查看该文件的缓存版本。尝试:

@post.increment!(:views_count)
@post.reload
于 2012-07-21T21:34:47.420 回答
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
于 2012-07-21T21:48:37.130 回答