v7.1.3.2
更多資訊請至 rubyonrails.org: 更多 Ruby on Rails

Rails 應用程式範本

應用程式範本是包含 DSL 的簡單 Ruby 檔案,用於將寶石、初始化程式等新增至您新建立的 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 的 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"

如果指定區塊,區塊中的 gem 項目會包覆至來源群組。

add_source "http://gems.github.com/" do
  gem "rspec-rails"
end

2.4 environment/application(data=nil, options={}, &block)

config/application.rbApplication 類別中新增一行。

如果指定 options[:env],這行會附加至 config/environments 中對應的檔案。

environment 'config.action_mailer.default_url_options = {host: "http://yourwebsite.example.com"}', env: 'production'

可以使用區塊取代 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 檔案。在上述步驟中,我們產生了一個人員鷹架,並移除了 README.rdoc。現在,要讓 PeopleController#index 成為應用程式的預設頁面

route "root to: 'person#index'"

2.11 inside(dir)

讓您從指定的目錄執行命令。例如,如果您有邊緣軌跡的副本,並希望從您的新應用程式建立符號連結,您可以這樣做

inside('vendor') do
  run "ln -s ~/commit-rails/rails rails"
end

2.12 ask(question)

ask() 讓您有機會從使用者取得一些回饋,並在您的範本中使用它。假設您希望您的使用者命名您正在新增的全新函式庫

lib_name = ask("What do you want to call the shiny library ?")
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?("Run database migrations?")
# no?(question) acts just the opposite.

2.14 git(:command)

Rails 範本讓您執行任何 git 命令

git :init
git add: "."
git commit: "-a -m 'Initial commit'"

2.15 after_bundle(&block)

註冊一個回呼,在 gem 捆綁完成且 binstub 產生後執行。對於將產生的檔案新增到版本控制很有用

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

回饋

我們鼓勵您協助提升本指南的品質。

如果您看到任何錯字或事實錯誤,請協助我們修正。若要開始,您可以閱讀我們的 文件貢獻 區段。

您也可能會發現不完整或過時的內容。請務必為 main 新增任何遺漏的文件。請務必先查看 Edge Guides,以驗證問題是否已在 main 分支修復。查看 Ruby on Rails 指南指南,以了解風格和慣例。

如果您發現需要修復的項目,但無法自行修補,請 開啟問題

最後但並非最不重要的一點,我們非常歡迎在官方 Ruby on Rails 論壇上討論任何有關 Ruby on Rails 文件的問題。