2015-07-21 55 views
0

所以我的電腦刷新了(所有的應用程序都丟失了),所以我不得不重新安裝rails,然後回到我在刷新之前做的項目。當我啓動項目文件夾備份和試圖遷移的數據庫,我得到這個錯誤:未定義的方法after_save rails 4.1.1和ruby 2.1.5

C:\RailsProjects\Blog>rake db:migrate 

DL已被棄用,請用小提琴

- after_save的(:assign_date)

- - after_save(:assign_date)

rake中止!

NoMethodError:未定義的方法after_save' for #<ActiveRecord::Migration:0x262be10> C:/RailsProjects/Blog/db/migrate/20150318235356_add_date_to_articles.rb:7:in ' C:/RailsProjects/Blog/db/migrate/20150318235356_add_date_to_articles.rb:1:在`'

而我的遷移文件如下:

class AddDateToArticles < ActiveRecord::Migration 
    def change 
    add_column :articles, :date, :date 

    end 

    after_save :assign_date 

    protected 
    def assign_date 
    self.date = Date.current 
    end 

end 

關於我可以改變什麼的任何建議?我覺得這可能是我的導軌安裝,但我更新了導軌寶石,但它仍然失敗。

+0

遷移文件中的回調?我以前沒有見過。 – Pavan

回答

0

您必須在模型中定義after_save回調,而不是在遷移中。您可能有一個文章模型,您將在其中定義

class Article < ActiveRecord::Base 
    after_save :assign_date 

    protected 

    def assign_date 
    self.date = Date.current 
    end 
end 

但要小心,因爲我認爲這不會做你期望的。如果你真的想在每次創建對象時保存它,你必須在before_save回調中運行它。

我告訴你更多,你不需要它!在你的表中創建一個字段created_atcreated_on,而不是date(非常糟糕的名字),Rails會爲你做這些,不需要任何類型的回調。

created_at將保存對象創建時間的時間戳,created_on將保留日期而不是時間戳。 您還有另一個字段是updated_at/on它將保留上次更新的時間戳/日期。

+0

嗯,那麼我不知道它是如何進入我的遷移文件。這一切都工作在重新安裝rails和升級到ruby 2之前,所以我真的不知道發生了什麼。但是,謝謝你! – aBrokenSniper

+0

如果它幫助你,然後投票並簽署答案是正確的。 – coorasse

0

其實你是以錯誤的方式做的。回調永遠不會寫入遷移文件。如果你想給所有現有的文章分配日期,那麼:

class AddDateToArticles < ActiveRecord::Migration 
    def change 
    add_column :articles, :date, :date 
    Article.all.each do |article| 
     article.date = Date.current 
     article.save 
    end 
    end 
end 

希望這會有所幫助。

+0

有趣!我也會試試這個。謝謝你的幫助! :) – aBrokenSniper

相關問題