Rails アプリの立ち上げ方(自分用)

### 1. アプリのディレクトリを作成する
1. アプリケーション名でディレクトリを作成
`$ mkdir hoge`

1. Gemfileを作る
`$ bundle init`
>アプリディレクトリの中で作る

1. Gemfileの中身、「デフォルトで書いてあるコード」のコメントアウトを外す
`$ vi Gemfile`でコメントアウトを外して `$ cat`で確認

1. Gemfileに記述された `gem "rails"` を hoge/vendor/bundle にインストールする。
`$ bundle install --path vendor/bundle`
>この`$ bundle install`は、「rubyのバージョンごと」にインストールされている「数少ない基本的な必要最小限のgem」の中の１つである "bundler" を利用しているのである。`--path vendor/bundle` で 現在存在していないvendorディレクトリとbundleディレクトリを作りつつ、そこにbundle install されるように指定している。

1. rails new する
`$ bundle exec rails new . -d mysql`
>"rails" のgemはrubyのバージョンごと、つまりグローバルには入っていないので`bundle exec`をつけてローカルのgemを参照しないと `rails new` できない。`.`でカレントディレクトリを選択し、`-d mysql` でデータベースの形式をmysqlにする
※ rails newする時に、「後でrspecにするから標準のテストは要らない！」という場合は、”-T” オプションを付けるとテスト作成をスキップしてくれます (20170613:追記)

1. Gemfile がコンフリクトを起こす
`f` と表示されるので、`yes` または `y` と入力してenterキーをおす。

1. .gitignoreを修正
 1. [gitignore.io](https://www.gitignore.io)上の検索窓に"rails"と入力し、出てきたコードを .gitignore に上書き保存する
 1. /vendorを.gitignoreに追加
 1. mailerとか、不要であれば、そのファイルはそもそも消す。共有する必要のないものはgitに載せないのが基本
---
### 2. git のリポジトリを作る
1. git のリポジトリを作る
`$ git init`
>".git" というディレクトリがこのアプリのディレクトリ内に作られ、そこにgitのローカルリポジトリが入る。

1. initial commit をする
`$ git add .`
`$ git commit -m "initial commit"`
>`$ git add .`でカレントディレクトリの変更点を全てadd して、`$ commit -m "initial commit"` でadd された変更点をローカルリポジトリにコミット、最初なのでコミットメッセージは"initial commit"

-----githubを利用する場合-----
1. [github](aahttps://github.com)上で、アプリ名のリモートリポジトリを作成する。

1. リモートリポジトリを登録する
`$ git remote add origin <リモートレポジトリのurl>`
>あらかじめgithubのサイトで作成しておいたリモートリポジトリのurlを、`origin`という短縮名（なんでも良いが、普通はoriginにする）で登録しておく。

1. リモートリポジトリにpushする
`$ git push origin master`
>省略せずに書くと、
`git push git@github.com:DQNEO/sample.git master:master`
リモートリポジトリのurlへ、master:master(ローカルのmasterをリモートのmasterに反映させる)

------github終わり------
1. develop ブランチを切る
`$ git branch develop`
>gitflowの手順に従った管理をする場合、最初に勝手に作られるmasterブランチは完成品のみを乗せていくブランチなので、すぐにdevelopブランチを切る。

1. develop ブランチに乗りかえる（チェックアウトする）
`$ git checkout develop`
>※〇〇ブランチにチェックアウトする。とは、〇〇ブランチに乗り換えること。
>※commitした状態からでないとチェックアウトはできない。
>`$ git checkout -d <branchname> `でブランチ作成とチェックアウトが同時に行える。つまり、上記２つの作業を１つに省略できる

1. `git commit --allow-empty -m "first commit"`
   `git push origin ブランチ名`
>ブランチを切ったらfirst commit してリモートにもpushする

1. Githubのサイト上でdefaultのブランチをdevelopにする

1. feature/hoge_function ブランチを切る
`$ git branch feature/hoge_function`
>gitflowの手順に従った管理をする場合、deelopブランチからfeature/<作りたい機能>ブランチを切って各featureブランチ上で作業を行っていくため、featureブランチを切る。

1. feature/hoge_function ブランチに乗り換える
`$ git checkout feature/hoge_function`
---

### 3. READMEにデータベース設計を書く
- chatspaceなどを参照に、アソシエーションやindexなども細かく記載。
---

### 3. Gemを入れる


Gemfile.lockにバージョンが記述されるとはいえ、Gemは__絶対にバージョン指定しておくこと！__
理由↓
>ただし、ローカル環境がWindows、リモート環境がLinux、というようなシチュエーションでは、バイナリありのgemだと入れるバージョンが異なってきうること、さらには片方だけ入れるgemが発生することもあって、Gemfile.lockを共有することができず、それぞれ別個に生成せざるを得なくなってしまっています。
さらに悪いことに、リモートサーバをAWSのElastic Beanstalkで生成していたため、サーバの変動ごとにGemfile.lockが生成されることとなり、Gemfileで指定しない場合、gemは常に最新版が呼ばれることとなってしまいました。
Gemfile.lockは動作環境が異なる場合は適用されないので、必ずGemfileにバージョンを指定しよう

[バージョン指定の仕方](https://qiita.com/awakia/items/5745938c192ca1139c63)
>一度指定せずに入れて、gemfile.lock に書かれたインストールされた最新バージョンの数字をそのままGemfileに書けばいいかも
 基本は、<strong>後方互換のある修正</strong>はすべて受け入れればよいので数字を2つだけ書いて指定する。
 数字は、x.x.x = 大幅な改変ごと.後方互換のある変更ごと.バグ修正ごと

`gem "hoge", "~> 2.1"  # 2.1.0以上3.0.0未満の最新のものを使用`
>例えばdeviseなどの大き目のgemだったり、なんだかんだでバグ修正以外の機能追加が入ると動かなくなりそうというようなものは数字３つで指定しておく。

`gem "hoge", "~> 2.1.8"   # 2.1.8以上2.2.0未満の最新のものを使用`


### 4. hamlを導入する
1. Gemfileに以下を追加（全ての環境で使用するので一番下に書く）
~~~Ruby
#to convert erb file to haml file
gem 'haml-rails'
gem 'erb2haml'
~~~

1. bundle installする

1. ターミナルで以下を実行
~~~
bundle exec rake haml:replace_erbs
~~~

1. gitでaddしてcommitする

### 4. scssを導入する
1. stylesheets/application.css → application.scssに変える。中身を全て消して、以下を追加
~~~scss
@import "./reset";
~~~
>stylesheetsフォルダ内の_reset.scss(後ほど作成)を利用することで、cssを打ち消してくれる

1. _reset.scssファイルを作成する
>この中にリセットファイルをコピペする。YUI 3など。
ブラウザ規定のcssをリセットする（下記のコードを貼り付ける）
[HTML5 Reset Stylesheet | HTML5 Doctor](http://html5doctor.com/html-5-reset-stylesheet/)
__
>

1. _variableファイルを作成する
>この中に変数を定義して、他のファイルで`@import "./variable";`として利用する__


---

### 5. データベースを作成する
1. データベースを作成する
`$ bundle exec rake db:create`
>rake gem はグローバルではなくこのアプリのディレクトリ内（ローカル）にインストールされてるので、ローカルのgemを参照という意味の`bundle exec`をつける必要がある。bundler というgem はグローバルにインストールされている。
アプリケーション名_test と アプリケーション名_develop という名のデータベースがpcのデータベース保管場所に作成される。rails アプリケーション場の変化はない。

1. db/seed.rbを編集して初期のデータを決めることができる
---


### 6. モデルを作成する
1. モデルのクラスが記入されたファイルを、rails gem を使って作成する
`$ bundle exec rails g model モデル名(小文字単数) text:string`
>モデルのクラスが記入された「モデル名.rb」というファイルと、テーブルの設計図であるマイグレーションファイルが作成される。
また、小技として、モデル名の後に
`$ bundle exec rails g model モデル名(小文字単数) カラム名:データのタイプ カラム名:データのタイプ カラム名:データのタイプ`
と入力することで、作成されるマイグレーションファイルにあらかじめカラムの設計図を自動で入力しておいてくれるので少し便利。

1. マイグレーションファイルをもとに、データのテーブルを作成する
`$ bundle exec rake db:migrate`
>マイグレーションファイルが読み込まれ、「モデル名s」という名のテーブルがpc内のデータ保管場所にある「アプリ名_develop」データベース上に作成される。「アプリ名_test」データベースには作成されない→__よくわからない__
 >>カラムの値が空にならないようにする場合
  `validates_presence_of :カラム名`をモデル名.rbに記入するか、マイグレーションファイルに`null:false`を記入してDBにnullの存在を禁止するか→[リンク](https://teratail.com/questions/59911)
---


### 7. rails g の設定をする（やらなくても良い）
1. config/initializers/ に、generators.rbを作成し、以下のように記入する（例）
~~~Ruby
Rails.application.config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
  g.template_engine :haml
  # g.test_framework :rspec, view_specs: false, helper_specs: false, fixture: true #よくわからない
  # g.fixture_replacement :factory_girl, dir: "spec/support/factories" #よくわからない
end
~~~

>`rails g controller` をすると、勝手に色々なファイル（coffeとか）が作成されてしまうので、デフォルトで何を生成するか設定する。template_engineには、hamlを入れておこう。
### 7. コントローラーを作成する
1. コントローラのクラスが記入されたファイルを、rails gem を使って作成する
`$ bundle exec rails g controller コントローラ名(小文字s)`
>このコントローラーのファイル「コントローラー名_controller.rb」が作成される。また、js(coffee)とcssファイルも作成される。helperが作成される(使うとコードが綺麗になる)
小技として、
`$ bundle exec rails g controller コントローラ名(小文字s) アクション名 アクション名 アクション名`
と入力することで、「コントローラー名_controller.rb」ファイル上にアクションをあらかじめ記入してくれるし、各アクションのview(html.erbファイル)も自動で作成してくれるし、「routes.rb」ファイルに各アクションへのルートを自動で入力してくれる。
---

>rails g controller しても関連ファイルが作成されない問題が起きた。調べたところ、全く同じ症状の人がいて、"spring"というgemを削除すると問題が解決するという回答があり、試したら解決した。[→リンク](https://stackoverflow.com/questions/32875986/issues-generating-controllers-with-rails)__ spring がよくわからない__


---
### 8. herokuにアップする
1. ターミナル上でアプリケーションのファイルに移動し、herokuにログインする
`$ heroku login`
>herokuに登録してアカウント取得、さらに[heroku toolbelt](https://devcenter.heroku.com/articles/getting-started-with-ruby#set-up) をインストールしておかないと、herokuコマンドが使えない。コマンド入力後、メアド、パスワード、2factor認証などを行う。2factor認証はgoogleのiphoneアプリで登録しておいた。

1. rails-2factor gemをアプリに入れる
Gemfile
~~~ruby
group :production do
  gem 'rails_12factor'
end
~~~

1. バンドルインストールでgemfileを読み込む
`$ bundle install --path vendor/bundle`

1. よくわからないけどなければ付け足す
config/environments/production.rb
~~~ruby
config.assets.compile = true
~~~

1. heroku上にアプリを作成する
$ heroku create アプリ名
>載せたいアプリのファイル上に移動してからコマンドを実行
名前を変更したい場合は、`$ heroku rename 新アプリ名`

1. データベースをmysqlに変更する
`$ heroku addons:add cleardb`

1. config/environments/production.rb 32行目あたりの記述をtrueに変更する
`config.assets.compile = true`
> 通常本番環境ではアセットパイプラインを通る処理が自動実行されないので、それをtrueにしておく。これをやらないとcss,javascript,imageが崩れる

1. mysqlのバージョンをrailsアプリのmysql gemと合わせる
  1. 現在のherokuのmysqlのバージョンを確かめる
`$ heroku config | grep CLEARDB_DATABASE_URL`
>mysql:~~~~の部分

  1. 既存DATABASE_URLの設定を解除する
`$ heroku addons:detach DATABASE -a herokuアプリのurl`

  1. データベース情報を再設定
`$ heroku config:add DATABASE_URL='mysql2:~~ ※先程表示されたデータベース情報をmysql2:に変更して入力'`

1. Heroku への Web アプリケーションのデプロイ
`$ git push heroku master`

1. herokuのデータベースにマイグレート
`$ heroku run rake db:migrate`



<br>
<br>
<br>


---
### 日本語化したい場合

- ##### エラーメッセージの日本語化
~~~Ruby
gem 'rails-i18n'
~~~
をインストールするだけ！
- ##### モデル名やカラム名の日本語化
config/locals に、ja.ymlを作成、以下の様に記述
~~~yml
  ja:
    activerecord:
      models:
        post: 投稿 #モデル
        user: ユーザー #モデル
      attributes:
        post: #postモデルの
          title: タイトル #カラム
          content: 内容  #カラム
        user: #userモデルの
          name: 名前
          email: Eメール
~~~

- ##### deviseの日本語化
githubに書いてある