edge
詳細はrubyonrails.orgで: もっとRuby on Rails

Railsアプリケーションテンプレート

アプリケーションテンプレートは、新しく作成されたRailsプロジェクトまたは既存のRailsプロジェクトにgem、初期化子などを追加するためのDSLを含むシンプルなRubyファイルです。

このガイドを読み終えると、次のことがわかります。

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エントリを追加します。

たとえば、アプリケーションがbjnokogiriのgemに依存している場合:

gem "bj"
gem "nokogiri"

このメソッドはGemfileにgemを追加するだけで、gemをインストールしません。

2.2 gem_group(*names, &block)

グループ内のgemエントリをラップします。

たとえば、rspec-railsdevelopmenttestグループのみでロードしたい場合:

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.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

上記のコードは、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フォーラムで大歓迎です。