【Rails】ぼくのかんがえたさいきょうの設定（rails newそのあとに）


タイトルの通り，新プロジェクトはじめるときにやらなきゃいけないことリスト．
毎回なんかしら忘れて[ぬとねの区別がつかなそうな顔](http://dic.nicovideo.jp/a/fx%E3%81%A7%E6%9C%89%E3%82%8A%E9%87%91%E5%85%A8%E9%83%A8%E6%BA%B6%E3%81%8B%E3%81%97%E3%81%9F%E4%BA%BA%E3%81%AE%E9%A1%94)になる．

つよくいきよう．


2014/12/1:
[**did_you_mean**](https://github.com/yuki24/did_you_mean)のリンクを修正していただきました．
@yuki24 さん，ありがとうございます（作者様自ら…申し訳ございません…）．

---

# rails new前に

`Test::Unit`と`bundle install`はいらんでｗ

```console
$ rails new my_app -B -T
```

# 基本設定

## .gitignoreの作成

僕はいつも[**gitignore.io**](https://www.gitignore.io/)で生成してます．
[だいたいこんな感じ](https://www.gitignore.io/api/rails,ruby,osx,linux,vim,sublimetext,rubymine)（Rails, Ruby, OSX, Linux, Vim, SublimeText, RubyMine）．

## Gemfile編集

毎回使うのはこんなもん？
[**Better Errors**](https://github.com/charliesome/better_errors)/[**binding_of_caller**](https://github.com/banister/binding_of_caller)あたりは無いと拗ねる．
[*rails_best_practice*](https://github.com/railsbp/rails_best_practices)，[*rack-mini-profiler*](https://github.com/MiniProfiler/rack-mini-profiler)，[*Quiet Assets*](https://github.com/evrone/quiet_assets)，[*did_you_mean*](https://github.com/yuki24/did_you_mean)はこれから積極的に使っていきたい．

```ruby:Gemfie
source 'https://rubygems.org'

group :default do
  gem 'rails'
  gem 'sass-rails'
  gem 'uglifier'
  gem 'coffee-rails'

  gem 'active_model_serializers'
end

group :test, :development do
  gem 'sqlite3'
end

group :development do
  gem 'spring'
  gem 'spring-commands-rspec'

  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-stack_explorer'
  gem 'pry-byebug'

  gem 'guard'
  gem 'guard-rspec'
  gem 'guard-spring'

  gem 'better_errors'
  gem 'binding_of_caller'

  gem 'rack-mini-profiler'
  gem 'bullet'
  gem 'quiet_assets'
  gem 'rails_best_practices'
  gem 'did_you_mean'

  gem 'annotate'
end

group :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'database_rewinder'
  gem 'rspec-request_describer'
  gem 'autodoc'
  gem 'json_spec'
end

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', '~> 0.4.0'
end
```

## TimeZone，localeの設定

[rails-i18n](https://github.com/svenfuchs/rails-i18n)から[ja.yml](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)を取ってきて，`config/locales`に配置．

日本人だからTokyoにしてるけど正直よくわかってない（誰か教えてください）．

```ruby:config/application.rb
module MyApp
  class Application < Rails::Application
    
    # 中略...

    config.time_zone = 'Tokyo'

    # 中略...

    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{rb,yml}').to_s]
    config.i18n.default_locale = :ja

  end
end
```

## generatorの設定

* JS（Coffee）やCSS（Scss）は自分で作るからいらない派
* helperもあまり使わない派
* テストはRSpec派
* fixtureはfactory girl派
* routing specやview spec，helper specはあまり書かない派
* controller specはエラー出てないことだけは確認する派
* request specはAPIについてのみ書く派
* [haml](http://haml.info/)とか[slim](http://slim-lang.com/)を使いたい時もここで（`config.generators.template_engine = :slim`）

```ruby:config/application.rb
module MyApp
  class Application < Rails::Application
    
    # 中略...

    config.generators do |g|
      g.javascripts false
      g.stylesheets false
      g.helper false
      g.test_framework :rspec,
        fixture: true,
        view_specs: false,
        helper_specs: false,
        routing_specs: false,
        controller_specs: true,
        request_specs: true
      g.fixture_replacement :factory_girl, dir: 'spec/factories'
    end
  end
end
```

## binstubの生成（spring）

はやい（よくわかってない）．

[**spring-commands-rspec**](https://github.com/jonleighton/spring-commands-rspec)を入れてるので`bin/rspec`も生成されるぜ．

```console
$ bundle exec spring binstub --all
```


# テスト（RSpec）周り

## RSpecの設定

これ毎回忘れて毎回死ぬ．

```console
$ bin/rails g rspec:install
```

### `rails_helper.rb`と`spec_helper.rb`の違い

> `spec/rails_helper.rb` に Rails 特有の設定を書き、`spec/spec_helper.rb`には RSpec の全体的な設定を書く、というようにお作法が変わるそうです。これによって、Railsを必要としないテストを書きやすくなるんだとか。 <cite>[RSpec 3 時代の設定ファイル rails_helper.rb について - willnet.in](http://www.willnet.in/126)</cite>

`*/**/*_spec.rb`先頭付近の`require 'spec_helper'`は`require 'rails_helper'`に置き換わるっぽい．

## DatabaseRewinderの設定

[**DatabaseRewinder**](https://github.com/amatsuda/database_rewinder)はテストのたびにDBのお掃除するやつ．

曰く，
> minimalist's tiny and ultra-fast database cleaner <cite>[amatsuda/database_rewinder](https://github.com/amatsuda/database_rewinder)</cite>

```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  config.before :suite do
    DatabaseRewinder.clean_all
  end

  config.after :each do
    DatabaseRewinder.clean
  end
end
```


## factory_girlの設定

[**factory_girl**](https://github.com/thoughtbot/factory_girl)はテストデータをいい感じに作れるやつ．

```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  config.before :all do
    FactoryGirl.reload
  end
end
```


### RequestDescriber, autodoc, json_specの設定

APIまわりのテスト3種の神器（？）．

```spec/rails_helper.rb
RSpec.configure do |config|
  config.include JsonSpec::Helpers
  config.include RSpec::RequestDescriber, type: :request
  Autodoc.configuration.toc = true
end
```

### seedでfactory_girlつかう

こっちのがすっきりするやん？

```ruby:db/seeds.rb
require 'factory_girl'

Dir[Rails.root.join('spec/factories/**/*.rb')].each { |f| require f }

# 略
```



# その他べんりな設定

## 自動annotateの設定

[**annotate**](https://github.com/ctran/annotate_models)は↓こんなやつ↓を`models`，`test`（`spec`），`fixtures`（`factories`）の先頭につけてくれる．

```ruby:app/models/user.rb
# == Schema Information
#
# Table name: users
#
#  id                     :integer          not null, primary key
#  email                  :string(255)      default(""), not null
#  created_at             :datetime
#  updated_at             :datetime
#
# Indexes
#
#  index_users_on_email                 (email) UNIQUE
#

class User < ActiveRecord::Base

  # 中略

end

```

下のコマンドを実行したら`rake db:migrte`時に勝手にannotationつけてくれるようになるんやで（細かい設定は`lib/tasks/auto_annotate_models.rake`で変更可能）．

```console
$ bin/rails g annotate:install
```

## bullet

**N+1 queries**（N+1問題）を検出してくれるgem，[**bullet**](https://github.com/flyerhzm/bullet)．SQL力上げていこうな．

* JSでalert出す
* logファイル出力（`"#{Rails.root}/log/bullet.log"`）
* ブラウザのconsoleに出力
* Railsのログにも出力

```ruby:config/environments/development.rb
Rails.application.configure do

 # 中略

  config.after_initialize do
    Bullet.enable = true
    Bullet.alert = true
    Bullet.bullet_logger = true
    Bullet.console = true
    Bullet.rails_logger = true
  end
end
```

## guard

[**guard-rspec**](https://github.com/guard/guard-rspec)を入れてると変更ファイルを検知してrspecを実行してくれる（なんか2回実行されてる気がしなくもない…）．

あと，[guard-rspec](https://github.com/guard/guard-rspec)や[guard-spring](https://github.com/mknapik/guard-spring)じゃなくて[**guard-rails**](https://github.com/ranmocy/guard-rails)でも良かったりします？（誰か教えてください）

```console
$ bundle exec guard init
$ bundle binstub guard
```

```ruby:Guardfile
guard :rspec, cmd: 'bin/rspec -f doc' do
  # 中略
end
```


# 参考文献

## お世話になった本

* [**パーフェクト Ruby on Rails**](http://www.amazon.co.jp/gp/product/4774165166?ie=UTF8&camp=1207&creative=8411&creativeASIN=4774165166&linkCode=shr&tag=masayuki5210-22)
* [**Everyday Rails - RSpecによるRailsテスト入門**](https://leanpub.com/everydayrailsrspec-jp)
* [Metaprogramming Ruby 2](https://pragprog.com/book/ppmetr2/metaprogramming-ruby-2)
* [こころ](http://www.amazon.co.jp/gp/product/B00IZ7R7LK?ie=UTF8&camp=1207&creative=8411&creativeASIN=B00IZ7R7LK&linkCode=shr&tag=masayuki5210-22)[ぴょん](http://www.amazon.co.jp/gp/product/B00IZ7R7B0?ie=UTF8&camp=1207&creative=8411&creativeASIN=B00IZ7R7B0&linkCode=shr&tag=masayuki5210-22)[ぴょん](http://www.amazon.co.jp/gp/product/B00MIDW7J4?ie=UTF8&camp=1207&creative=8411&creativeASIN=B00MIDW7J4&linkCode=shr&tag=masayuki5210-22)
* [がんばるぞい！](http://www.amazon.co.jp/gp/product/4832244140?ie=UTF8&camp=1207&creative=8411&creativeASIN=4832244140&linkCode=shr&tag=masayuki5210-22&colid=1GRX51EKH0ZOV&coliid=I3SARXC3GO0QE7)

## 参考になった記事

* [debug - Rails4 今のところ最強なデバッグツール達 - Qiita](http://qiita.com/yusabana/items/8ce54577d959bb085b37)
* [RSpec 3 時代の設定ファイル rails_helper.rb について - willnet.in](http://www.willnet.in/126)
* [File: GETTING_STARTED — Documentation for factory_girl (4.4.0)](http://rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md)

## 使ったgemとか

* [charliesome/better_errors](https://github.com/charliesome/better_errors)
* [banister/binding_of_caller](https://github.com/banister/binding_of_caller)
* [railsbp/rails_best_practices](https://github.com/railsbp/rails_best_practices)
* [MiniProfiler/rack-mini-profiler](https://github.com/MiniProfiler/rack-mini-profiler)
* [evrone/quiet_assets](https://github.com/evrone/quiet_assets)
* [yuki24/did_you_mean](https://github.com/yuki24/did_you_mean)
* [jonleighton/spring-commands-rspec](https://github.com/jonleighton/spring-commands-rspec)
* [amatsuda/database_rewinder](https://github.com/amatsuda/database_rewinder)
* [thoughtbot/factory_girl](https://github.com/thoughtbot/factory_girl)
* [ctran/annotate_models](https://github.com/ctran/annotate_models)
* [flyerhzm/bullet](https://github.com/flyerhzm/bullet)

## お世話になってるコミュニティ

* [神戸.rb](http://koberb.doorkeeper.jp/)
* [西脇.rb & 神戸.rb](http://nishiwaki-koberb.doorkeeper.jp/)