rails、君に決めた！！~15

一連の記事の目次
[rails、君に決めた！！~目次](https://qiita.com/satousatou/items/d20b61c198a4d439f2e7)


# 運用編
## 初期設定

```bash
mkdir RailsSampleApp
cd RailsSampleApp
bundle init

(Gemfileのrailsのコメントアウトを外してから)
bundle install --path vendor/bundle --jobs=4
bundle exec rails _5.1.3_ new ./ -B -d mysql --skip-turbolinks --skip-test
```

```ruby
# coffee-scriptは使用しないのでコメントアウト
# gem 'coffee-rails', '~> 4.2'

group :development do
   # 追加
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'pry-byebug'
  gem 'pry-rails'
end
```

```bash
bundle install
```

### gitのセットアップ

```bash 
git init
# リモートでリポジトリを作ってから
git remote add origin git@github.com:xxxx/RailsSampleApp.git
```

ここまででサーバーが起動するか確認

```bash
bin/rails s
```

http://localhost:3000
にアクセス

```bash
git add .
git commit -m '[add] initial commit'
git branch develop
git checkout develop
```

masterは本番環境用なので、開発用にdevelopブランチを作成

### .gitignore

```
.idea
.DS_Store
```

```bash
git add .gitignore
git commit -m '[add] .gitignoreにリストを追加'
```

### テスト実行環境のセットアップ
Gemfile

```ruby
group :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'database_cleaner'
end
```

```bash
bundle install
bin/rails g rspec:install
```

### データベースのセットアップ

```bash
bin/rails db:setup
bundle exec rspec

git add .
git commit -m '[add] テスト実行環境の構築'
```

### README.md

```
# RailsSampleApp

## 動作環境
- ruby: 2.4.1
- Rails: 5.1.3
```

```bash
git add README.md
git commit -m "READMEに概要記載"
```

### Encrypted secretsのセットアップ
> 機密情報を管理するための機能で、secrets.ymlにそのまま保持したくないパスワードなどを暗号化して保存できる

逆にそのまま保持していいパスワードってあるの？？

```bash
bin/rails secrets:setup
```

secrets.yml.enc:認証情報が暗号化されたファイル
secrets.yml.key:復号するための鍵
の２ファイルが生成される

> encryption: 暗号化

次に各環境でEncrypted secretsを利用できるようにconfig/application.rbに以下を追記

```ruby
module RailsSampleApp
  class Application < Rails::Application
    # 追加
    config.read_encrypted_secrets = true
  end
end
```

これでdevelopment環境でもEncrypted secrets機能が使えるようになった。
secrets.ymlの編集はこんな感じ

```bash
EDITOR=vim bin/rails secrets:edit

# 試しにhoge変数にhelloを入れてみる
shared:
  hoge: hello


bin/rails c

Loading development environment (Rails 5.1.5)
[1] pry(main)> Rails.application.secrets
=> {:secret_key_base=>
  "xxxx",
 :hoge=>"hello",
 :secret_token=>nil}
```

secrets.ymlを元に戻してからコミットしてね

```bash
git add .
git commit -m "[add] Encrypted secretsのセットアップ"
```

### .ruby-versionのセットアップ

```bash
# .ruby-versionファイルが生成される
rbenv local 2.4.1

git add .ruby-version
git commit -m "[add] .ruby-version追加"
```

他の開発者が`rbenv local`を実行したら、.ruby-versionに記載されたバージョンのrubyがインストールされる

### .editorconfigのセットアップ
エディタが違うとインデントや改行コードが統一されてないかもしれないので、統一したい

.editorconfig

```
root = true

[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf
```

```bash
git add .
git commit -m "[add] .editorconfigの追加"
```

### ApplicationControllerの設定
Rails4
呼び出し順序に関わらず、`protect_from_forgery`が最初に呼ばれる
Rails5
コードの記述順で呼び出し順序が変わる

Rails4のように常に最初にverification処理を行いたいので、`prepend: true`を追記
app/controller/application_controller.rb

```ruby
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception, prepend: true
end
```

#### generatorコマンドの軽量化
generatorコマンドをカスタマイズして、routing,assets,helperは自動で生成しないように変更する。
config/application.rb

```ruby
module RailsSampleApp
  class Application < Rails::Application

    config.generators do |g|
      g.skip_routes true
      g.stylesheets false
      g.javascripts false
      g.helper false
    end

  end
end
```

```bash
git add .
git commit -m "アプリケーションの基本設定"
```


#### gemのセットアップ
不要なgemの除去
Gemfile

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

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

# base
gem 'rails', '~> 5.1.5'
gem 'therubyracer', platforms: :ruby, github: 'cowboyd/therubyracer'

# database
gem 'mysql2', '>= 0.3.18', '< 0.5'

# server
gem 'puma', '~> 3.7'

# view
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'turbolinks', '~> 5'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'

  # 追加
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'pry-byebug'
  gem 'pry-rails'
end

group :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'database_cleaner'
end
```

##### rubocop
コーディング規約に従っていないコードを検出する静的解析ツール。pep8みたいなものか

```ruby
group :development do
  gem 'rubocop'
end
```

.rubocop.ymlに自分ルールを記述することができる。今回は以下のようにする

```yml
inherit_from: .rubocop_todo.yml

AllCops:
  Exclude:
    - db/**/*

# classやmoduleの先頭コメント
Documentation:
  Enabled: false

# 日本語でのコメント
Style/AsciiComments:
  Enabled: false

# 行長
Metrics/LineLength:
  Max: 120

# ブロック内の行数
Metrics/BlockLength:
  Exclude:
    - spec/**/*
    - config/**/*
```

##### Bootstrap
Gemfile

```ruby
# view
gem 'bootstrap', '~> 4.0.0.beta2.1'
gem 'jquery-rails'
gem 'popper_js', '~> 1.12.3'
gem 'tether-rails'
```

##### Annotate
モデルファイルにテーブルのストラクチャ情報に関するコメントを追記

```ruby
group :development do
  gem 'annotate'
end
```

```bash
bundle install
git add .
git commit -m 'Gemfileのセットアップ'
```

##### GitHooksの設定

コミット前に自動チェックしてくれる。

Gemfile

```ruby
group :development do
  gem 'overcommit'
end
```

```bash
bundle install
bundle exec overcommit --install
```

.overcommit.ymlが作成されるのでRuboCopの設定を追加する

```yml
gemfile: Gemfile
PreCommit:
 RuboCop:
   enabled: true
 AuthorName:
   enabled: false
```
注意：

```yml

gemfile: Gemfile
```
は本には書いてない。これを書かないとエラーがでる。

> gitのユーザー名制約を行うAuthorNameを無効化している

masterブランチにプッシュできる人を制限したりできるっぽい。今回は無制限に設定している

設定を変更したので

```bash
bundle exec overcommit -s
```
で設定の変更を許可する

```bash
git add .
git commit -m "Git Hooks /Rubocopの設定"
```



---解決済み---

```yml

gemfile: Gemfile
```
を書かないときに発生するエラー

お、エラーでた

```bash
This repository contains hooks installed by Overcommit, but the `overcommit` gem is not installed.
Install it with `gem install overcommit`.
```

パスが通ってない、、？

```bash
$ cat .bash_profile

eval "$(rbenv init -)"
export PATH="$HOME/.rbenv/bin:$PATH"
```

いや、通ってるな〜

```bash
bundle exec overcommit --run
```

は実行できる。。

最終手段

```bash
git reset --hard コミットid
```

.gitファイル内のhookディレクトリも消去


Git Hookはなくていいか。。とばそう。
どなたか修正方法分かる方教えてください🙇


とりあえず初期環境設定は以上で終わり