rails new 手順書

こんにちは、 Advent Calendar が後半に近づくにつれ NoScheduleOnChristmasError が raise されそうな気配がただよってきましたが、上位クラスのどこでも rescue される気配はありません。

ぼくは浮気症な性格のため、 `rails new` した回数はけっこう多いです。何回やっても「あれどうやるんだっけ」と調べている自分がいたので、いつもやってる新規プロジェクト立ち上げ手順をまとめてみます。

## 対象の読者

* Rails 開発をちょっとでもかじったことがある
* 近々 `rails new` しようと目論んでいる

## rails new

まずは何はともあれ `rails new` をします。ただ、このコマンドをそのまま通すためにはシステムの gem として rails をインストールしなければなりません。 Ruby も Rails も開発が活発で、追従しているとたくさんのバージョンを半永久的にインストールし続けることになるため、 gem はできるだけ bundler 管理とし、 vendor/bundle に入れたいです。 [システムのgemにrailsをインストールせずrails newする](http://qiita.com/youcune/items/222777415f00d19cccb4) という記事を見つけたのでその手順に従ってやってみます。

```bash
$ mkdir project_name
$ cd project_name
$ bundle init
Writing new Gemfile to /path/to/project_name/Gemfile
```

のようにして Gemfile を生成し、下記のように編集します。 `gem "rails"` のコメントを外すだけです。

```rb:Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "rails"
```

そしたら bundler 経由で rails をインストールするため、下記実行します。

```bash
$ bundle install --path vendor/bundle --without staging production --jobs=4
```

bundler は、設定したオプションを `.bundle/config` に記録して覚えます。一度指定したら次からオプションをつけなくともついているものとして実行してくれますので、早い段階で覚えさせておきましょう。今は Gemfile に staging も production もありませんが、今後どうせ書くので without させ、 [Bundlerで並列処理？？bundle installを爆速で処理する方法。](http://qiita.com/camelmasa/items/5ca27ab398f105f86c76) に従って jobs も覚えさせておくことにします。

こんなファイルができています。

```yaml:.bundle/config
---
BUNDLE_PATH: vendor/bundle
BUNDLE_JOBS: 4
BUNDLE_WITHOUT: staging:production
BUNDLE_DISABLE_SHARED_GEMS: '1'
```

そしてようやく `rails new` をしますが、普通にやってはいけません。 bundler でインストールしてシステムの gem 以外の場所に入ったコマンドを呼び出すには `bundle exec` 経由で実行します。

また、どうせ RSpec 使うし、標準からちょいちょい入れ替えたい gem もあるので、 Test::Unit を組み込まず(`--skip-test-unit / -T`) bundle install もしない(`--skip-bundle / -B`)ようにします。ちなみに他のオプションは `bundle exec rails help new` で調べられますので、好みのある方は調べて指定すべきです。たとえばぼくは jQuery 新しいの使いたいので Javascript も組み込まず(`--skip-javascript / -J`)下記のようにします。

Rails が Gemfile を作成しようとしますがすでに存在するとのことで上書きしていいか聞いてきますので上書きしてください。

```bash
$ bundle exec rails new . -BJT
    :
    :
    conflict  Gemfile
Overwrite /path/to/project_name/Gemfile? (enter "h" for help) [Ynaqdh] Y
```

ようやく `rails new` の完了です。長かった……。ここから Gemfile や設定をイジっていきます。

## Gemfile をイジって bundle install

### テンプレートエンジン

ERB だと開発効率がちょっと……という感じなので、 haml か slim を使いたくないですか？　僕は haml 派なので Gemfile に下記追加します。

```rb:Gemfile
gem 'haml-rails'
```

ちなみに好みがあるかもしれませんが、僕は依存性は bundler がやってくれると信じて、バージョンアップの情報を都度 watch していない gem については bundle update したときに最新版になるよう、バージョンは指定しないことにしています。逆に、 rails みたいなものはアップデート情報を watch しているため、意図せずバージョンが変わらないように指定しています。

### Rspec, FactoryGirl

よく `rspec` と `rspec-rails` 両方書いている例を見かけますが、 rspec-rails は rspec に依存しているので両方書く必要はありません。

ハイフンとアンスコがむずくて何回やっても見ずに書けるようになりません。

```rb:Gemfile
gem 'rspec-rails'
gem 'factory_girl_rails'
```

そして RSpec まわりの初期設定をします。

```bash
$ bundle exec rails generate rspec:install
```

また、テストコードに `FactoryGirl.create(:user)` と毎回書くのはダルいので、 `FactoryGirl.` を省略して書けるように設定しておきます。

`spec/rails_helper.rb` の `RSpec.configure` ブロック内に下記追加します。

```rb:spec/rails_helper.rb
config.include FactoryGirl::Syntax::Methods
```

あ、そうそう、昔は spec_helper.rb だったのが RSpec3 から rails_helper.rb に分割されているので気をつけてください。

### bundle install

あとは好みで Gemfile をいじっていき `bundle install` をかまします。定番 gem などは、 [1人Webサービス開発で使っているGemfileそのまま公開 - Qiita](http://qiita.com/s3pw/items/a0c77cf3d9592e9e1bad) でいい感じに紹介してあり、使いたいものを使えばいいと思います。

## generator

デフォルトの ERB ⇢ HAML, Test::Unit ⇢ RSpec, Fixture ⇢ FactoryGirl に入れ替えたわけなので、 `rails generate` のときに正しく生成されるようにしたいです。また、 Javascript と CSS は最終的に自分で管理することが多いので僕はオフにしてます。

[rails newしたらconfig.generatorsをまず設定しよう](http://qiita.com/yuutetu/items/135b1c8ab512208aebfe) を参考に、たとえば下記のように設定します。

```rb:config/application.rb
config.generators do |g|
  g.javascripts false
  g.stylesheets false
  g.template_engine :haml
  g.test_framework :rspec, view_specs: false, fixture: true
  g.fixture_replacement :factory_girl, dir: 'spec/factories'
end
```

## master ブランチにコミット

僕はこの段階で一旦 master ブランチにコミットします。 `/vendor/bundle` を `.gitignore` するのを忘れないようにしましょう。リポジトリが巨大になります。

```bash
$ bundle install
$ echo '/vendor/bundle' >> .gitignore
$ git init
$ git add .
$ git commit
```

## 終わりに

いかがでしたか？（って最近みんな記事の末尾に書く風潮がある気がするのでマネします）他にもこんなこと必要でしょとかここ間違えてるぞとかあればコメントで教えてください！