所以我的电脑刷新了(所有应用程序都丢失了)所以我不得不重新安装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,但它仍然失败了。
答案 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_at
或created_on
,而不是date
(非常糟糕的名称),Rails将为您完全执行此操作,无需任何类型的回调。
created_at
将保存创建对象的时间戳,created_on
将保留日期而不是时间戳。
您还有另一个updated_at/on
字段,它将保留上次更新的时间戳/日期。