生成和执行第一个生成器
#lib/generators/initializer_generator.rb
class InitializerGenerator < Rails::Generators::Base
desc "This generator creates an initializer file at config/initializers"
def create_initializer_file
create_file "config/initializers/initializer.rb", "# Add initialization content here"
end
end
#执行
rails generate initializer #可以在config/initializers中看到initializer.rb文件,内容为# Add initialization content here
使用生成器创建生成器
#使用生成器创建生成器,意思就是快速生成生成器的方法
rails generate generator initializer
create lib/generators/initializer
create lib/generators/initializer/initializer_generator.rb
create lib/generators/initializer/USAGE
create lib/generators/initializer/templates
#initializer_generator.rb, Rails::Generators::NamedBase需要有一个参数来创建脚本的名字
class InitializerGenerator < Rails::Generators::NamedBase
source_root File.expand_path("../templates", __FILE__)
def copy_initializer_file
#templates中创建文件initializer.rb文件,文件内容为"# Add initialization content here"
copy_file "initializer.rb", "config/initializers/#{file_name}.rb" #file_name是Rails::Generators::NamedBase方法
end
end
#执行
rails generate initializer core_extensions #生成config/initializers/core_extensions.rb,文件内容为initializer.rb内容
创建文件并且在文件中动态创建方法
# lib/generators/my_helper_generator.rb
class MyHelperGenerator < Rails::Generators::NamedBase
def create_helper_file
create_file "app/helpers/#{file_name}_helper.rb", <<-FILE
module #{class_name}Helper
attr_reader :#{plural_name}, :#{plural_name.singularize}
end
FILE
end
end
#执行
rails generate my_helper products #生成app/helpers/products_helper.rb
#文件及文件内容如下
module ProductsHelper
attr_reader :products, :product
end
#脚手架中使用这个生成器
config.generators do |g|
g.helper :my_helper
end
生成器的查找路径
#执行rails generate initializer core_extensions,执行代码,从下面的几个文件中查找
#下面的所有文件都在lib目录下面,lib目录在$LOAD_PATH中
rails/generators/initializer/initializer_generator.rb
generators/initializer/initializer_generator.rb
rails/generators/initializer_generator.rb
generators/initializer_generator.rb
避免Rails自动创建的asset,helper和test文件
#config/application.rb
config.generators do |generator|
generator.helper false
generator.assets false
generator.view_specs false
generator.test_framework false
generator.skip_routes true #跳过路由的自动设置
end
通过修改模板改变脚手架内容