v7.0.0
更多資訊請前往 rubyonrails.org: 更多在 Ruby on Rails

Rails 應用模板

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

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

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 模板示例:

# 模板.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

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

gem "bj"
gem "nokogiri"

請注意,這不會為您安裝 gem,您必須執行 bundle install 才能執行此操作。

$ bundle install

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 環境/應用程式(data=nil, options={}, &block)

Application 類中為 config/application.rb 新增一行。

如果指定了 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(檔名,資料= 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 產生(什麼,*args)

使用給定的引數執行提供的 rails 產生器。

generate(:scaffold, "person", "name:string", "address:text", "age:number")

2.8 執行(命令)

執行任意命令。就像反引號一樣。假設您要刪除 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 路由(routing_code)

將路由條目新增到 config/routes.rb 檔案。在上面的步驟中,我們產生了一個人 scaffold 並刪除了 README.rdoc。現在,讓 PeopleController#index 成為應用程式的預設頁面:

route "root to: 'person#index'"

2.11 裡面(目錄)

使您能夠從給定目錄執行命令。例如,如果您希望從新應用程式符號連結邊緣 rails 的副本,則可以執行以下操作:

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

2.12 問(問題)

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 是?(問題)還是否?(問題)

這些方法讓您可以從模板中提問並根據使用者的回答決定流程。假設您想提示使用者執行 migrations:

rails_command("db:migrate") if yes?("Run database migrations?")
# no?(question) 行為正好相反。

2.14 git(:command)

Rails 模板讓你可以執行任何 git 命令:

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

2.15 after_bundle(&block)

註冊一個 callback 在 gems 和 binstubs 捆綁後執行 產生。對所有產生的檔案進行版本控制很有用:

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

即使已通過 --skip-bundle,也會執行 callbacks。

3 高階用法

應用程式模板在以下上下文中進行評估 Rails::Generators::AppGenerator 實例。它使用 apply action 由 Thor 提供。

這意味著您可以擴充套件和更改實例以滿足您的需求。

例如通過覆蓋 source_paths 方法來包含 模板的位置。現在像 copy_file 這樣的方法將接受 模板位置的相對路徑。

def source_paths
  [__dir__]
end

回饋

我們鼓勵您幫助提高本指南的品質。

如果您發現任何拼寫錯誤或資訊錯誤,請提供回饋。 要開始回饋,您可以閱讀我們的 回饋 部分。

您還可能會發現不完整的內容或不是最新的內容。 請務必為 main 新增任何遺漏的文件。假設是 非穩定版指南(edge guides) 請先驗證問題是否已經在主分支上解決。 請前往 Ruby on Rails 指南寫作準則 查看寫作風格和慣例。

如果由於某種原因您發現要修復的內容但無法自行修補,請您 提出 issue

關於 Ruby on Rails 的任何類型的討論歡迎提供任何文件至 rubyonrails-docs 討論區