edge
更多資訊請參考 rubyonrails.org: 更多 Ruby on Rails

Rails應用程式模板

應用程式模板是包含DSL的簡單Ruby檔案,用於將gem、初始化程式等添加到新建的Rails專案或現有的Rails專案中。

閱讀本指南後,您將了解:

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)

將提供的gem添加到生成的應用程式的Gemfile中。

例如,如果您的應用程式依賴於gem bjnokogiri

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

以上代碼將創建具有boot:strap rake任務的lib/tasks/bootstrap.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文件中。在上面的步驟中,我們生成了一個人的脊柱並刪除了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) 或 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 論壇 上進行。