Rails new ⇒ 必須の設定  を3秒で済ます

AdventCalender20日目、担当の望月です。
現在受託会社で主にサーバーサイドのエンジニアやりつつ、たまーにTECH::CAMPにも顔出してます。

##何を書くのか

Railsで新しいアプリケーションを作るときって、rails new　から初めて、ごにょごにょと決まった作業をしていきますよね？

でも、僕は問いたいです。
**「その作業、無駄じゃないですか？」**と。

**同じ処理は２回繰り返さない** というDRYの原則のもと、どうせ毎回同じ作業(日本語に直して、DB作って、gem入れて...etc)するなら、いっそテンプレ化しちゃおうよ。　というのが今回の趣旨となります。

なので本記事では、新しくアプリを作り始める際に「これは毎回やるなー」ってことを雛形として作成してみましたので、その使用手順をまとめていきたいと思います。

## ゴール

コマンドを数本打つだけで2~3時間分の初期設定が済んだファイルをローカルに持ってきて、
開発スタート時の「前の開発でもやったわ、めんどくさー」っていう作業を無くしたいと思います。
(打つべきコマンド一覧は記事下部に記載してます)

頭を使わない作業は極力簡略化して、是非開発にスタートダッシュをかけてください！

## 各種ファイルの設定

今回の雛形ファイルには、素のrails newをした初期設定に加えて、下記のような設定が施されています。

### 環境別ファイルの設定
config/enviropments/development.rbを下記のように変更してあります。

```ruby:development.rb
config.action_mailer.raise_delivery_errors = true #falseをtrueに変更

config.action_mailer.default_url_options = { host: 'localhost:3000' } #付け足し

```

これで、ActionMailerのエラー表示設定 & deviseの初期設定を行っています。

### アプリケーション本体に関する設定

config/locals/application.rbに、下記を追加しましょう。

```ruby:application.rb
   config.generators do |g|
      g.test_framework  nil 
      g.assets  false
      g.helper false
      g.stylesheets false
    end    
```
こちらでrails generateをした際に、テストファイルやhelperファイルなどが同時生成されることを防ぎます(もちろん、必要な場合は適宜設定を変更してください。)

また、同ファイルの下記も変更しておきましょう。

```ruby:application.rb
config.i18n.default_locale = :ja

config.time_zone = 'Tokyo'
```

こちらで、言語設定を日本語に、時刻を東京基準に変更しております。

### Flashの設定

application.html.erbの、<body>タグ開始直後、<%= yield %> 上部に、下記を追記しました。

```erb:application.html.erb
  <% flash.each do |key, value| %>
    <% key = "info" if key == "notice" %>
    <% key = "danger"  if key == "alert" %>
    <%= content_tag :div, value, class: "alert alert-#{key}" %>
  <% end %>
```

また、bootstrap用のkeyを許可するために、application_controllerに下記を追記しています。

```ruby:application_controller
  add_flash_types :success, :info, :warning, :danger
```

これでbootstrapのkeyでflashメッセージが送られたら、とりあえず表示されるようにはなりました。



## Gemの設定
効率化に欠かせないのは、何と言ってもgemです。

**車輪の再発明**という言葉があるように、一度誰かが作ったものをもう一度作り直すなんてことはナンセンスですよね。
ですので、多くのアプリで必要とされ、なおかつgemで提供されている機能に関しては、積極的に取り入れるようにしています。

では、そのGemの一覧、Gemfileを見てみましょう。

```ruby:Gemfile
gem 'rails', '4.2.6' #バージョン指定は適宜変更
gem 'turbolinks'     #Railsのページ遷移高速化のためのgem
gem 'sdoc', group: :doc # Rubyのソースを読み取り、ブラウザで閲覧しやすいドキュメントを生成してくれる
gem 'haml-rails' #hamlが使えるように
gem 'therubyracer'

# UI/UX
gem 'jquery-rails'
gem 'coffee-rails'
gem 'bootstrap-sass' #bootstrap導入
gem 'font-awesome-rails' #アイコンタグを挿入するヘルパーメソッドを提供
gem 'uglifier' #JSのコード軽量化ライブラリ。UglifyJS2をrubyで使えるようにしたもの
gem 'sass-rails'
gem 'jbuilder'
gem 'wareki' #元号表示(平成や昭和など)に対応。案外使える


# ユーザー機能
gem 'devise' #ユーザー機能導入
gem 'devise-i18n' #devise日本語化
# gem 'bcrypt' #パスワード暗号化機能を提供してくれる。　本番に上げる際はコメントアウトを外す。

# 役割定義
gem 'cancancan' #役割別に出来ること、出来ないことを定義できる。

# 各種ファイル設定用
gem 'dotenv-rails' #ドットファイルの定義用
gem 'config' #定数定義用
gem 'enum_help' #enumの日本語化

# データベース
gem 'mysql2', '~> 0.3.18' #バージョン指定は適宜変更

# seed用
gem 'seed-fu'

# 検索機能
gem 'ransack' 

# ページネーション
gem 'kaminari' 

# パンくず
gem 'gretel'

# アップロード用
gem 'carrierwave'
gem 'mini_magick' #画像リサイズ用のgem
gem 'fog'

# フォーム
gem 'bootstrap_form'

# 論理削除
gem 'paranoia'

# Model拡張
gem 'active_hash'

# 管理画面
gem 'adminlte2-rails'

# サーバー
# gem 'unicorn'  実際にunicornを使う際はコメントアウトを外す

group :development, :test do
  # デバッグ用
  gem 'byebug'
  gem 'better_errors'
  gem 'pry'
  gem 'pry-byebug'
  gem 'pry-doc'
  gem 'pry-rails'
  gem 'pry-stack_explorer'
  gem 'hirb'
  gem 'awesome_print'
  gem 'letter_opener' #メール送信機能をローカルで試すためのgem
  gem 'web-console', '~> 2.0'

  # CLI
  gem 'spring'

  # Table/Scheme
  gem 'annotate' #schemaをモデルに書き出してくれる

  # デプロイ
  # gem 'capistrano' #自動デプロイ用 デプロイ時に使用する際はコメントアウトを外す

end
```

デフォルト外のものや、何に使ってるか分かりづらそうなものにはコメントを入れてあります。

## gem別の設定ファイル

gemによっては、指定のディレクトリに指定の名前でファイルを用意しないと使えない...なんてこともあります。
ですが、こちらも雛形に組み込み済です。
皆さんは下の説明をみながら、「どのファイルがどのgem設定用のファイルなのか」をしっかりと認識した上でご使用ください。

### bootstrap-rails
今回はsassで導入しましたので、それに沿ってファイルを編集していきます。
手順は...
1.元々あるapplication.cssを、application.scssにリネーム
2.その中身を全部消す
3.新たに

```ruby
@import "bootstrap-sprockets";
@import "bootstrap";
```
を記述。この記述によってbootstrapが読み込まれる。

4.application.jsに

```js
//= require jquery
//= require bootstrap-sprockets
```
を追加。

以上4工程です。
また、lessの場合の導入などは、[こちら](http://qiita.com/shizuma/items/83cdadbe0a629f1f74d1)が参考になるのでよろしければ。


### font-awesome-rails
application.scssにこちらを追加

```ruby:application.scss
@import "font-awesome";
```

詳しくはこちらを参照
[RailsにFont Awesomeを導入するGem](http://qiita.com/succi0303/items/7f76d53ebe54dab41124)
[Rails に font-awesome-rails を入れて Awesome Font を使う](http://easyramble.com/font-awesome-rails.html)

### devise
1.まずはデバイスの導入から。こちらのコマンドでインストール。

```console
$ rails g devise:install
```
initializeのファイル等々が生成されます。

2.続いてviewファイルもインストールしときましょう。(ココらへんは好きなものを入れればOKです)

```console
$ rails g devise:views
```

ここから先は共通部分ではないので工程としては省きますが、
devise絡みのモデルを作成したい場合は、

```console
$ rails g devise user(任意のモデル名)
```

としてあげればOKです！　
詳しくはこちらを参照。
[Deviseの設定手順をまとめてみた。 その1　導入編](http://qiita.com/itboze/items/ea0d9236d89fa24a7a1c)

### devise-i18n

gem独自に設定することは無いのですが、１点だけ。
localeの設定を日本語に変更しておきましょう！(今回の雛形では既に設定済です。)
[deviseを日本語化する](https://dev.9bar.tokyo/rails/devise-i18n)


### cancancan

使用前にコマンドを一つ叩いておきましょう。

```console
$ rails g cancan:ability
```

こうすることで、model配下に

```ruby:ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
  end
end
```
というファイルが生成されます。
そしてこのファイルにユーザー権限やアクセス制限等について書いていき、その辺りの管理を一元化していきましょう。というgemになります。
使い方に結構癖があったので、[このあたり](http://qiita.com/umanoda/items/679419ce30d1996628ed)を見ながら勉強していってください。

### dotenv

アプリケーションのルートディレクトリで、一つコマンドを叩いておきましょう。

```
$ touch .env
```

これを行うことで、.envというファイルがルートディレクトリに作成されます。
あとは、この中にアプリケーションで使用する環境変数を書いていけばいいだけ。非常に楽ちんです。
間違ってもこの.env自体をgitにpushするなんてことの無いように。。。
(clone後は、.gitignoreに追加するなどして二度とプッシュしないようにしてくださいw)
[環境によって変わる設定値はdotenvを使うと便利](http://qiita.com/closer/items/f8d8ba00ae86d7051764)


### config
設定ファイルインストールの為のコマンドを一つ叩きましょう。

```console
$ bundle exec rails g config:install
```

このコマンド一つで、

```
config/settings.yml #全ての環境のYAML 
config/settings.local.yml #ローカル環境専用のYAML
config/settings/development.yml #開発環境専用のYAML  
config/settings/test.yml #テスト環境専用のYAML
config/settings/production.yml #本番環境専用のYAML 
```

これらのファイルが追加されるとともに、.gitignoreなどにも追記がされます。

記述方法なども合わせて[こちら](http://qiita.com/yumiyon/items/32c6afb5e2e5b7ff369e)に詳しい解説が載っております。

### enum_help
特に無いです！　locals/ja.ymlというところに日本語訳をまとめて書いていって、決まった呼び出し方をすれば日本語で表示されます。便利！
呼び出し方等は以下でご確認を。
[【Rails】enumをI18n対応させるenum_helpが便利すぎた](http://kimuraysp.hatenablog.com/entry/2016/05/19/233144)

### seed_fu

ファイル配置用のディレクトリだけ先に作ってしまいましょう。

```console
$ mkdir db/fixtures
$ mkdir db/fixtures/development
$ mkdir db/fixtures/production
```

どのように初期データを投入するかに関しては、こちらをお読みください。
[railsで初期データを入れる(seed-fuの使い方)](http://qiita.com/ko2ic/items/be96e450a33d631e0059)

### ransack

検索用のgemですね。
初期設定は特に必要ないです。
使い方はこちらを参照。
[Railsでransackを使って検索機能を作成する](http://ruby-rails.hatenadiary.com/entry/20141008/1412774436)

### kaminari

まずはこのコマンドを叩きましょう。

```
rails g kaminari:config
```
こちらでkaminari設定ファイルが作成されます。


また、ページネーションのデザインをbootstrapっぽくしたいのであれば、下記コマンドを叩きましょう。

```
rails g kaminari:views bootstrap3
```

bootstrap3以外にも色々と選択肢があるみたいです。
設定など詳しくは下記から。
[Railsでkaminariを使ってページネーションを実現する](http://ruby-rails.hatenadiary.com/entry/20141113/1415874683)


### gretel

こちらのコマンドを叩きましょう。

```console
$ rails g gretel:install
```

これにより、config/breadcrumb.rbというファイルが生成されます。
ここに、パンくずリストを一元化していきましょう。
詳しくはこちら。
[パンくずリストを出す Gretel Gem が使いやすくて感動した](https://muryoimpl.com/blog/2014/04/03/gertel-gem/)

### carrierwave / mini_magick / fog

これらは実際にアップロードを行う際に個別の設定を記述していくので、初期段階では特に設定する必要はありません。
(fogはS3に画像をアップロードする際に必要です)
設定が必要になったタイミングで、下記記事らを参考にしてみてください。
[Rails 4.1 で CarrierWave を使う](http://qiita.com/akishin/items/46b2e239cf4190171da8)
[Fog + carrierwaveでAWS S3に画像をアップロード](http://morizyun.github.io/blog/carrierwave-fog-s3-upload-aws/)

### bootstrap_form

application.scssに、下記を記述しましょう。

```scss
@import "rails_bootstrap_forms"
```

これで、bootstrap_form_forあるいはbootstrap_form_tagという記述が使えるようになります。
では、この記述を使うことで何が出来るのか...
それは、公式のReadmeが一番詳しかったので、載せておきますね。
[bootstrap-ruby/rails-bootstrap-forms](https://github.com/bootstrap-ruby/rails-bootstrap-forms)

### paranoia

なにもすることはありません。
論理削除を導入したいモデルに acts_as_paranoia と書き、 そのテーブルにdatetime型でdeleted_atというカラムを追加すればOKです。
[Railsで論理削除をするacts_as_paranoidを試してみた](http://llcc.hatenablog.com/entry/2015/01/04/230345)

### active_hash

こちらも必要が出たら設定しましょう。
[静的データのモデル化にactive_hash gemが便利・・！](http://kotatu.org/blog/2014/10/09/active-hash-gem/)

### adminlte2-rails

管理画面のテンプレートエンジンですね。
とりあえず、root配下にadminコントローラーやviewを作ってしまいます。(ここは手順省略)

そして、viewファイルを手元に持ってくるために、下記コマンドを叩きましょう。

```console
$ bundle exec rails g admin_lte2
```

こちらでviewやらCSSやらが一式手元にやってきます。
(マニュフェストファイル名がapplication.scssでないと上手く行かないようです。)

最後に、このテンプレートを使用するコントローラーに下記を記述しておきましょう。

```scss
  layout 'admin_lte_2' 
```
これで指定のコントローラーでadmin_lte_2のテンプレートが使えるようになりました。


### pry系

pryの設定は、別途.pryrcというファイルで行います。
アプリケーションのルート階層に、下記を配置しておきましょう。

```ruby:.pryrc
# hirbの設定
begin
  require 'hirb'
rescue LoadError
  # Missing goodies, bummer
end

# AwesomePrintの設定
begin
  require "awesome_print"
  Pry.config.print = proc { |output, value| output.puts value.ai }
rescue LoadError
  puts "no awesome_print :("
end

if defined? Hirb
  # Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |output, value|
        Hirb::View.view_or_page_output(value) || @old_print.call(output, value)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  Hirb.enable
end

if defined?(PryByebug)
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
  Pry.commands.alias_command 'c', 'continue'
  Pry.commands.alias_command 'bt', 'show-stack'
end
```

以上で各種gemの設定はおしまいです。


#最後に
さぁ。今まで様々な設定に関してあれこれと見てきましたが、
恐らくこの雛形をcloneしただけではrails gコマンドが動かないかと思います。
ですので、cloneしてbundle installしたら

```console
$ spring stop
$ bin/spring
```

この２つのコマンドを叩いてあげてください。
こちらでアプリが正常に動くかと思います。

また、cloneしたままだと既にコミット先のレポジトリが指定されている状態なので、

```sh
rm -rf .git/
```
このコマンドで**gitの管理から外しておきましょう。**
(この後ご自身で開発してgit管理を行う場合は、通常通りの流れで大丈夫です。)

**アプリの名前も変えておきましょう。**

```console
$ mv base_project ◯◯(新しいアプリ名)
```
これで変更されているかと思います。

**DB名も変更します。**


```:datebase.yml
「base_project」 となっている箇所を、ご自身のアプリ名に変更
```

これでひとまずはオッケーです！
(細かいとこありそうなのですが、まだ試してないので分かったら教えてください。)


##まとめ

この雛形を使うために、打たなかれば行けないコマンドを、今一度まとめます。

```console
$ git clone ~~~~(ご自身のレポジトリにひな形ファイルをご用意ください)
$ rm -rf .git/
$ mv base_project ◯◯(新しいアプリ名)
$ bundle exec bundle install
$ spring stop
$ bin/spring
$ bundle exec rake db:create
```
以上です。
簡単ですね。

「依存絡みでgemが入らない」とか「DBのソケットが違う」とか、環境によって諸々問題は出てくるかと思うので、初回は根気がいるかもですw
頑張ってください。

１点注意なのですが、**必ずご自身のレポジトリに雛形を作ってください！**
ご自身の使いやすい設定で雛形を作るのが一番かと思いますし、
誤って僕のレポジトリの上書き...なんてことになったら。。。　笑




では、**クリスマスまであと4日！**
**皆さん、ハッピークリスマス♡**