edge
更多信息请访问 rubyonrails.org: 更多 Ruby on Rails

Rails应用模板

应用模板是简单的Ruby文件,包含DSL,用于向新创建的Rails项目或现有的Rails项目添加gems、初始化器等。

阅读本指南后,您将了解以下内容:

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条目。

例如,如果您的应用程序依赖于bjnokogiri这两个gems:

gem "bj"
gem "nokogiri"

请注意,此方法只会将gem添加到Gemfile中,而不会安装gem。

2.2 gem_group(*names, &block)

将gem条目包装在一个组中。

例如,如果您只想在developmenttest组中加载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 文档的任何问题。