2015-07-21 57 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

相关问题