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 bj
和 nokogiri
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"
如果指定區塊,區塊中的 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'
可以使用區塊取代 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 文件的問題。