为了避免在我想重新初始化项目时触发许多rake任务,我在lib/task/twiddle.rake
中创建了以下任务:
task :twiddle => %w(db:drop db:create railties:install:migrations db:migrate db:seed spree_sample:load)
从命令行触发这些命令的每一个都有效。
但是,rake twiddle
运行spree_sample:load
时会挂起NoMethodError: undefined method `slug' for #<Spree::Product:0x0000000ec9b9f0>
并出现以下错误:
{{1}}
有人可以解释为什么运行一组特定任务会在CLI上运行而不是通过rake任务吗?我需要一些图书馆吗?
答案 0 :(得分:3)
实际上答案相对简单--Rails仅在引导时从数据库加载架构信息。 (您可以执行类似reset_schema_information的操作以强制重新加载)
你通常不会做db:migrate后跟db:seed,因为Rails不会在迁移和种子之间重新加载应用程序。因此,当db:seed运行时,它将没有表信息。这就是为什么你看到不同的结果,如果你单独运行它们 - 单独运行它们的行为使Rails重新加载自己并修复了尝试工作的catch-22与仅由前一个命令提供的模式。
还有栏杆:安装:迁移对你的任务毫无意义 - 你只是自己作为开发人员一次运行它,它会创建几个迁移文件(你签到git),然后这些文件存在你的应用永远。您不会重新运行railties:定期安装:迁移,因为您已经创建了这些迁移文件。 (当你升级狂欢时,你会重新运行它,但这是另一回事)