1 使用法
テンプレートを適用するには、Railsジェネレータに適用するテンプレートの場所を-m
オプションで指定する必要があります。これはファイルのパスまたは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
エントリを追加します。
たとえば、アプリケーションがbj
とnokogiri
のgemに依存している場合:
gem "bj"
gem "nokogiri"
このメソッドはGemfile
にgemを追加するだけで、gemをインストールしません。
2.2 gem_group(*names, &block)
グループ内のgemエントリをラップします。
たとえば、rspec-rails
をdevelopment
とtest
グループのみでロードしたい場合:
gem_group :development, :test do
gem "rspec-rails"
end
2.3 add_source(source, options={}, &block)
指定されたソースを生成されたアプリケーションのGemfile
に追加します。
たとえば、gemを"http://gems.github.com"
からソースする必要がある場合:
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
上記のコードは、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
ファイルにルーティングエントリを追加します。上記の手順では、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)またはno?(question)
これらのメソッドを使用すると、テンプレートから質問をすることができ、ユーザーの回答に基づいてフローを決定することができます。例えば、ユーザーにマイグレーションを実行するかどうか尋ねたい場合は次のようにします。
rails_command("db:migrate") if yes?("データベースのマイグレーションを実行しますか?")
# no?(question)は逆の動作をします。
2.14 git(:command)
Railsテンプレートでは任意のgitコマンドを実行することができます。
git :init
git add: "."
git commit: "-a -m '初回コミット'"
2.15 after_bundle(&block)
gemsがバンドルされ、binstubが生成された後に実行されるコールバックを登録します。生成されたファイルをバージョン管理に追加するのに便利です。
after_bundle do
git :init
git add: '.'
git commit: "-a -m '初回コミット'"
end
このコールバックは、--skip-bundle
が渡された場合でも実行されます。
3 高度な使用法
アプリケーションテンプレートはRails::Generators::AppGenerator
インスタンスのコンテキストで評価されます。これはThorが提供するapply
アクションを使用しています。
これは、インスタンスを拡張および変更して、自分のニーズに合わせることができることを意味します。
例えば、source_paths
メソッドを上書きしてテンプレートの場所を含めるようにすることができます。これにより、copy_file
などのメソッドはテンプレートの場所に対する相対パスを受け入れるようになります。
def source_paths
[__dir__]
end
フィードバック
このガイドの品質向上にご協力ください。
タイポや事実の誤りを見つけた場合は、ぜひ貢献してください。 開始するには、ドキュメントへの貢献セクションを読んでください。
不完全なコンテンツや最新でない情報も見つかるかもしれません。 メインのドキュメントに不足しているドキュメントを追加してください。 修正済みかどうかは、まずEdge Guidesを確認してください。 スタイルと規約については、Ruby on Rails Guides Guidelinesを確認してください。
修正すべき点を見つけたが、自分で修正できない場合は、 問題を報告してください。
そして最後に、Ruby on Railsのドキュメントに関するあらゆる議論は、公式のRuby on Railsフォーラムで大歓迎です。