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


Rails アプリケーションの雛形を簡単に作成するための Rails アプリケーションテンプレートのざっくりとした利用方法を掴むために超意訳してみました。参考までに、関連する記事も貼っておきます。

## 原文

* [Rails Application Templates — Ruby on Rails Guides](http://guides.rubyonrails.org/rails_application_templates.html)

## 参考

* [RailsのApplication templateを使って開発の初速をあげよう！ - Qiita [キータ]](http://qiita.com/tachiba/items/26b2e9dc271bd8e6907d)
* [Application Templatesを使ってRailsの初期構築を自動化 | kotamiyake.me (old)](http://old.kotamiyake.me/2011/09/06/application-templates-for-rails/)
* [Rails templateで開発の初速を上げよう](http://www.slideshare.net/chariderpato/rails-template-27829933)
* [Rails プロジェクトでスタートダッシュを決める](http://www.slideshare.net/TomohikoHimura/rails-template)
* [rails new した時の追加処理をかく - そんなこと覚えてない](http://blog.eiel.info/blog/2013/08/03/rails-new-template/)
* [RailsWizard - Simple Rails Templates courtesy of Intridea](http://railswizard.org/)

***

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

アプリケーションテンプレートは、gems や initializers を追加するための DSL を含む簡単な Ruby ファイルです。

このガイドを読むと分かること:

* Rails アプリケーションを自動生成、又は、カスタマイズするためにテンプレートを利用する方法
* Rails テンプレート API を利用して、独自の再利用可能なアプリケーションテンプレートを書く方法

## 利用方法

テンプレートを適用するには、Rails ジェネレーターの `-m` オプションを利用して、適用したいテンプレートの位置を指定する必要があります。いずれかのファイル、又は、URL へのパスを指定することが可能です。

```bash
$ rails new blog -m ~/template.rb
$ rails new blog -m http://example.com/template.rb
```

既存の Rails アプリケーションにテンプレートを適用するには、`rails:template` という rake タスクを利用することが可能です。

```bash
$ rake rails:template LOCATION=~/template.rb
$ rake rails:template LOCATION=http://example.com/template.rb
```

## テンプレート API

Rails テンプレート API は、簡単に理解することが可能です。
典型的な Rails テンプレートはこのようになります。

```ruby:template.rb
generate(:scaffold, "person name:string")
route "root to: 'people#index'"
rake("db:migrate")

git :init
git add: "."
git commit: %Q{ -m 'Initial commit' }
```

以下のセクションでは、API によって提供される主要な方法の概要を示します。

### gem(*args)

自動生成されたアプリケーションの `Gemfile` に gem を追加するには、`gem` を追加します。

例えば、`bj` と `nokogiri` の gem を追加したい場合はこのようになります。

```ruby
gem "bj"
gem "nokogiri"
```

gem のインストールを行うためには、`bundle install` を実行する必要があります。

```ruby
run_bundle
```

### gem_group(*names, &block)

グループに gem を内包します。

例えば、`rspec-rails` の gem を `development` 又は、`test` グループで利用したい場合はこのようになります。

```ruby
gem_group :development, :test do
  gem "rspec-rails"
end
```

### add_source(source, options = {})

自動生成されたアプリケーションの `Gemfile` にソースを追加します。

例えば、"http://code.whytheluckystiff.net" から gem のソースを必要とする場合はこのようになります。

```ruby
add_source "http://code.whytheluckystiff.net"
```

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

`config/application.rb` の `Application` クラスにコードを追加します。

`options[:env]` を指定した場合、そのコードは`config/environments` の対応するファイルに追加されます。

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

ブロックは `data` 引数の代わりに利用することが可能です。

### vendor/lib/file/initializer(filename, data = nil, &block)

自動生成されたアプリケーションの `config/initializers` ディレクトリにイニシャライザーを追加します。

例えば、このようになります。

```ruby
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` からの相対パスを受け入れ、必要となる全てのディレクトリ、ファイルを作成します。

例えば、`app/components` ディレクトリに `foo.rb` を作成する場合はこのようになります。

```ruby
file 'app/components/foo.rb', <<-CODE
  class Foo
  end
CODE
```

### rakefile(filename, data = nil, &block)

指定されたタスクを `lib/tasks` 以下の新しい rake ファイルに作成します。

例えば、`boot:strap` rake タスクを `lib/tasks/bootstrap.rake` に作成する場合はこのようになります。

```ruby
rakefile("bootstrap.rake") do
  <<-TASK
    namespace :boot do
      task :strap do
        puts "i like boots!"
      end
    end
  TASK
end
```

### generate(what, *args)

指定された引数にて、Rails ジェネレーターを実行します。

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

### run(command)

任意のコマンドを実行します。

例えば、`README.rdoc` ファイルを削除したい場合はこのようになります。

```ruby
run "rm README.rdoc"
```

### rake(command, options = {})

Rails アプリケーションにて、rake タスクを実行します。

例えば、データベースをマイグレーションしたい場合はこのようになります。

```ruby
rake "db:migrate"
```

異なる Rails 環境の rake タスクを実行することも可能です。

```ruby
rake "db:migrate", env: 'production'
```

### route(routing_code)

`config/routes.rb` ファイルにルーティングを追加します。

```ruby
route "root to: 'person#index'"
```

### inside(dir)

指定したディレクトリにてコマンドを実行することが可能です。

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

### ask(question)

`ask()` は、テンプレートとして利用するかどうか、ユーザーからフィードバックを得ることが可能です。

```ruby
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
```

### yes?(question) or no?(question)

これらのメソッドを利用すると、質問をした結果、ユーザーの回答に基いてフローを決めることが可能です。

```ruby
rake("rails:freeze:gems") if yes?("Freeze rails gems?")
# no?(question) acts just the opposite.
```

### git(:command)

どのような git コマンドでも実行することが可能です。

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