2012-07-21 30 views
0

這裏有一段代碼在我的控制器: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

回答

0

你試過重新加載記錄嗎?我敢打賭,你正在看文件的緩存版本。嘗試:

@post.increment!(:views_count) 
@post.reload 
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 
+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

0

注意increment!電話update_attribute,進而調用save(:validate => false)。也就是說跳過驗證,但the callback chain is still executed和:

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

你有你的模型中定義的任何before_*回調可能被返回false,但在errors沒有設置什麼嗎?

相關問題