undefined方法after_save rails 4.1.1和ruby 2.1.5

时间:2015-07-21 06:24:54

标签: ruby-on-rails migration

所以我的电脑刷新了(所有应用程序都丢失了)所以我不得不重新安装rails,然后我又回到了我在刷新之前做的项目。当我重新启动项目文件夹并尝试迁移数据库时,我收到此错误:

C:\RailsProjects\Blog>rake db:migrate

不推荐使用DL,请使用Fiddle

- after_save(:assign_date)

- after_save(:assign_date)

rake aborted!

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:in''

我的迁移文件如下:

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

关于我可以改变什么的任何建议?我觉得它可能是我的rails安装,但我已经更新了rails gem,但它仍然失败了。

2 个答案:

答案 0 :(得分: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

希望这有帮助。

答案 1 :(得分: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字段,它将保留上次更新的时间戳/日期。