我有一个简单的rails安装生成器,用于我正在制造的引擎:
module Bouncer
module Generators
class InstallGenerator < Rails::Generators::Base
source_root File.expand_path("../../templates", __FILE__)
desc "Copies locale file and migrations to your application."
def copy_locale
copy_file "../../../config/locales/en.yml", "config/locales/bouncer.en.yml"
end
def copy_migrations
# I would like to run "rake bouncer_engine:install:migrations" right here
# rather than copy_file "../../../db/migrate/blah.rb", "db/migrate/blah.rb"
end
end
end
end
当用户运行rails g bouncer:install
时,会将区域设置文件复制到其应用中。我也希望复制我的迁移,但不是使用copy_file
方法,而是希望我可以在生成器中运行rake bouncer_engine:install:migrations
,就像我从命令行那样。我怎么能这样做?
答案 0 :(得分:3)
正确的方法:
#!/usr/bin/env rake
module Bouncer
module Generators
class InstallGenerator < Rails::Generators::Base
desc "Copies migrations to your application."
def copy_migrations
rake("bouncer_engine:install:migrations")
end
end
end
end
这样可以省去很多麻烦,甚至可以确保每个迁移的名称都有正确的时间戳。
答案 1 :(得分:1)
嗯,我认为应该可以通过执行shell命令来实现。 Here是在ruby中执行shell命令的6种不同方法。
但我的另一个建议是将其作为rake任务实施,而不是直接将其作为生成器的一部分实现......我不知道你的具体要求是什么,但鉴于你的描述,我认为执行安装任务时,迁移任务只运行一次?或者是否有特殊需要将它作为rake任务提供?