1 用法
要应用模板,您需要使用-m
选项为Rails生成器提供要应用的模板的位置。这可以是文件的路径或URL。
$ rails new blog -m ~/template.rb
$ rails new blog -m http://example.com/template.rb
您可以使用app:template
rails命令将模板应用于现有的Rails应用程序。模板的位置需要通过LOCATION环境变量传递。同样,这可以是文件的路径或URL。
$ bin/rails app:template LOCATION=~/template.rb
$ bin/rails app:template LOCATION=http://example.com/template.rb
2 模板API
Rails模板API易于理解。以下是典型Rails模板的示例:
# template.rb
generate(:scaffold, "person name:string")
route "root to: 'people#index'"
rails_command("db:migrate")
after_bundle do
git :init
git add: "."
git commit: %Q{ -m 'Initial commit' }
end
以下部分概述了API提供的主要方法:
2.1 gem(*args)
向生成的应用程序的Gemfile
添加所提供的gem的gem
条目。
例如,如果您的应用程序依赖于bj
和nokogiri
这两个gems:
gem "bj"
gem "nokogiri"
请注意,此方法只会将gem添加到Gemfile
中,而不会安装gem。
2.2 gem_group(*names, &block)
将gem条目包装在一个组中。
例如,如果您只想在development
和test
组中加载rspec-rails
:
gem_group :development, :test do
gem "rspec-rails"
end
2.3 add_source(source, options={}, &block)
将给定的源添加到生成的应用程序的Gemfile
中。
例如,如果您需要从"http://gems.github.com"
源引用一个gem:
add_source "http://gems.github.com"
如果给定了block,则block中的gem条目将被包装到源组中。
add_source "http://gems.github.com/" do
gem "rspec-rails"
end
2.4 environment/application(data=nil, options={}, &block)
向config/application.rb
中的Application
类添加一行。
如果指定了options[:env]
,则该行将附加到config/environments
中的相应文件中。
environment 'config.action_mailer.default_url_options = {host: "http://yourwebsite.example.com"}', env: 'production'
可以使用block代替data
参数。
2.5 vendor/lib/file/initializer(filename, data = nil, &block)
将初始化器添加到生成的应用程序的config/initializers
目录中。
假设您喜欢使用Object#not_nil?
和Object#not_blank?
:
initializer 'bloatlol.rb', <<-CODE
class Object
def not_nil?
!nil?
end
def not_blank?
!blank?
end
end
CODE
类似地,lib()
在lib/
目录中创建一个文件,vendor()
在vendor/
目录中创建一个文件。
甚至还有file()
,它接受一个相对于Rails.root
的路径,并创建所需的所有目录/文件:
file 'app/components/foo.rb', <<-CODE
class Foo
end
CODE
这将创建app/components
目录并将foo.rb
放在其中。
2.6 rakefile(filename, data = nil, &block)
在lib/tasks
下创建一个新的rake文件,并提供所需的任务:
rakefile("bootstrap.rake") do
<<-TASK
namespace :boot do
task :strap do
puts "i like boots!"
end
end
TASK
end
上面的代码将创建lib/tasks/bootstrap.rake
,其中包含一个boot:strap
rake任务。
2.7 generate(what, *args)
使用给定的参数运行所提供的rails生成器。
generate(:scaffold, "person", "name:string", "address:text", "age:number")
2.8 run(command)
执行任意命令。就像反引号一样。假设您想要删除README.rdoc
文件:
run "rm README.rdoc"
2.9 rails_command(command, options = {})
在Rails应用程序中运行所提供的命令。假设您想要迁移数据库:
rails_command "db:migrate"
您还可以在不同的Rails环境中运行命令:
rails_command "db:migrate", env: 'production'
您还可以以超级用户身份运行命令:
rails_command "log:clear", sudo: true
您还可以运行在失败时应中止应用程序生成的命令:
rails_command "db:migrate", abort_on_failure: true
2.10 route(routing_code)
向config/routes.rb
文件添加路由条目。在上面的步骤中,我们生成了一个person脚手架,并删除了README.rdoc
。现在,要将PeopleController#index
设置为应用程序的默认页面:
route "root to: 'person#index'"
2.11 inside(dir)
允许您从给定的目录运行命令。例如,如果您有一个edge rails的副本,希望从新应用程序中创建符号链接,可以这样做:
ruby
inside('vendor') do
run "ln -s ~/commit-rails/rails rails"
end
2.12 ask(question)
ask()
方法可以让您有机会从用户那里获取一些反馈,并在模板中使用它。假设您希望用户为您正在添加的新库命名:
lib_name = ask("您想如何命名这个新库?")
lib_name << ".rb" unless lib_name.index(".rb")
lib lib_name, <<-CODE
class Shiny
end
CODE
2.13 yes?(question) or no?(question)
这些方法允许您在模板中提问,并根据用户的答案决定流程。假设您想提示用户运行数据库迁移:
rails_command("db:migrate") if yes?("是否运行数据库迁移?")
# no?(question)则相反。
2.14 git(:command)
Rails模板允许您运行任何git命令:
git :init
git add: "."
git commit: "-a -m 'Initial commit'"
2.15 after_bundle(&block)
注册一个回调,在gems被捆绑和binstubs生成后执行。用于将生成的文件添加到版本控制:
after_bundle do
git :init
git add: '.'
git commit: "-a -m 'Initial commit'"
end
即使传递了--skip-bundle
,回调也会被执行。
3 高级用法
应用程序模板在Rails::Generators::AppGenerator
实例的上下文中进行评估。它使用Thor提供的apply
操作。
这意味着您可以扩展和更改实例以满足您的需求。
例如,通过重写source_paths
方法以包含模板的位置。现在,copy_file
等方法将接受相对于模板位置的路径。
def source_paths
[__dir__]
end
反馈
欢迎您帮助改进本指南的质量。
如果您发现任何拼写错误或事实错误,请贡献您的意见。 要开始,请阅读我们的 文档贡献 部分。
您还可能会发现不完整的内容或过时的内容。 请为主要内容添加任何缺失的文档。请先检查 Edge 指南,以验证问题是否已经修复或尚未修复。 请参阅 Ruby on Rails 指南准则 以了解样式和规范。
如果您发现需要修复但无法自行修复的问题,请 提交问题。
最后但同样重要的是,欢迎您在 官方 Ruby on Rails 论坛 上讨论有关 Ruby on Rails 文档的任何问题。