（初心者向け）Railsで新規開発するときの手順

こんにちは、よーすけと申します。
プログラミングスクールを卒業したばかりの私ですが、
カリキュラムを終えて1人でイチからアプリを作るにあたり、
調べながら自身で実行した手順をメモとして残します。
初学者の方のポートフォリオ作成の際の助けになれば幸いです。

# 0. 対象者
- 独学またはスクール等でrailsアプリを作ったことのある方

　(環境構築までは解説していませんのでご了承ください)

# 1. アプリを作るディレクトリを作成しよう！
```:terminal
（例）「ユーザー名/projects」に作る場合
$ cd
$ mkdir projects
$ cd projects
```
projectsディレクトリを作成し、移動してきました。

# 2. rails new で新規作成を宣言！


```:terminal
$ rails バージョン new アプリケーション名　オプション

（例）railsバージョン5.2.2.1、アプリ名「sampleapp」、DBはmysqlで作成
$ rails _5.2.2.1_ new sampleapp -d mysql
```

あくまで初心者向けの記事ですので、このような注意書きをしておきますが、railsのバージョンはご自身が扱ったことのある物をおすすめします。

独学時代は4を使っていたけど、ポートフォリオ作成にあたり新しい5を使おうとすると、バージョンアップで使えるもの、使えないものが混在してしまいご自身の知識外のエラーが起きてつまづきやすいです。

データベースも同様ですが、SQLを学んだことのある方はMySQLが無難でしょう。

# 3. 必要なGemをGemfileに追記しよう！

```:Gemfile
〜（省略）〜

（例）
gem 'devise'　　　　　ユーザーがログインしてアプリを使えるようにしたい
gem 'pry-rails'　　　デバッグの王様binding.pry
gem 'compass-rails'　css書くにあたって便利
gem 'sprockets'　　　stylesheetやjsをまとめてくれるやつ
gem 'haml-rails'　　html.erbではなくhtml.hamlで書く人用
gem 'carrierwave' 　画像アップロードしたい人はこちらもどうぞ
```
これらはあくまで一例です。説明もざっくりしたものなので、ご自身が作りたいアプリに必要な機能かどうか置き換えてくださいね。

# 4. Gemを追記したらbundle installでしょ！

```:terminal
$ bundle install
```
gemfileに書いたgemたちをインストールしてきます。

####deviseの使い方の参考記事
https://qiita.com/aplifyjp/items/ea0d9236d89fa24a7a1c

# 5.データベースを作ろう！
```:terminal
$ rake db:create

Created database 'sampleapp_development'
Created database 'sampleapp_test'
```
データベース作ったらモデルを作らなきゃ


# 6. モデルを作成しよう！
```:terminal
$ rails g model モデル名(頭文字大文字単数形)

（例）
$ rails g model Customer


Running via Spring preloader in process 85033
      invoke  active_record
      create    db/migrate/20190611145950_create_customers.rb
      create    app/models/customer.rb
      invoke    test_unit
      create      test/models/customer_test.rb
      create      test/fixtures/customers.yml
```
頭文字大文字単数形で入れましょう。
モデルとマイグレーションファイルができました。

# 7. migrationファイルにテーブル設定を書こう！
```ruby:db/migrate/20190611145950_create_customers.rb
class CreateCustomers < ActiveRecord::Migration[5.2]
  def change
    create_table :customers do |t|
      t.string :name, null: false
      t.string :kana, null: false
      t.integer :sex, null: false
      t.references :prefecture, foreign_key: true
      〜（省略）〜
    end
  end
end
```

書き終わりましたら`bundle exec rake db:migrate`でマイグレーションファイルの中身をテーブルに反映させます。

※気をつけていただきたいのが、references型という外部キー参照をする場合、
外部キーとして関連づけるテーブルが先にないと
「参照するテーブルがそもそもねえよ！」と怒られてしまいます。

```:terminal
$ bundle exec rake db:migrate
== 20190611145813 CreateTransactions: migrating ===============================
-- create_table(:transactions)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'sampleapp_development.prefectures' doesn't exist: SHOW FULL FIELDS FROM `customers`
```
なのでテーブル作成をする際に、他と関わりの少ないテーブルから作る方がいいです。
あとからカラムを追加したり変更することもありますので、そこまで神経質にならぬよう。
ただデータベース設計は大事ですので、頭の中だけでやるよりも
ER図などの形にすると具体化した方が作りやすいでしょう！

####テーブル作成についての参考記事
・マイグレーションを使ったテーブル作成
https://www.javadrive.jp/rails/model/index6.html
・Rails テーブルのデータ型について
https://qiita.com/s_tatsuki/items/900d662a905c7e36b3d4
・ER図をいい感じに作れそうなモデリングツールを探してみた
http://bashalog.c-brains.jp/18/02/14-144444.php

# 8. modelにアソシエーションを書こう！
```ruby:app/models/customer.rb
class Customer < ApplicationRecord
  has_many :transactions # お客さんはたくさんの取引を持っている
  belongs_to :prefecture # お客さんは1つの都道府県に属している
end
```

```ruby:app/models/prefecture.rb
class Prefecture < ApplicationRecord
  has_many :customers # 各都道府県はたくさんのお客さんを持っている
  has_many :institutions # 各都道府県はたくさんの施設を持っている
end
```

など
私が開発しているアプリに乗っ取ってるので、少々お堅いテーブルばかりですみません。
このようにテーブルごとの主従関係を記述していきましょう。

ちなみに1対多の組み合わせは`has_many`と`belongs_to`ですが、
多対多というものもあります。
わかりやすい例ではLINEを思い浮かべていただいて、
ユーザーは複数のグループに入っている
グループには複数のユーザーが参加している
などです。各自調べてみてくださいね。

####アソシエーションについての参考記事
https://railsguides.jp/association_basics.html

# 9. ルーティングを設定しよう！
```ruby:config/routes.rb

Rails.application.routes.draw do
  devise_for :users
  root 'users#index'
  resources 'transactions'
  resources 'customers'
end
```

脱初心者の象徴`resources`でルーティングを書きましょう！
慣れない方、ページ数がそもそも少ないアプリを考えている方は直接買いてもOK

```ruby:config/routes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'users#index'
  get 'tansactions/new' => 'transactions#new'
  post 'transaction' => 'transactions#create'

　　　〜（省略）〜

end
```


# 10. コントローラーを作成しよう！

```:terminal
$ rails g controller コントローラー名

（例）
$ rails g controller Transactions

Running via Spring preloader in process 57249
      create  app/controllers/transactions_controller.rb
      invoke  assets
      invoke    coffee
      invoke    scss
```

# 11. ビューファイルを作成しよう！
最後に
`app/views`ディレクトリにhtmlファイル
`app/assets/stylesheets`ディレクトリにcssファイルを作成します。
gem`sprockets`を入れていればcssファイルは基本作成しただけで全て読み込んでくれます。
（仕組みを知りたい方は「アセットパイプライン」で検索してみてね）

# 12. いざ、サーバー起動！
```:terminal
$ rails s
```

googlechromeなどで`http://localhost:3000`と打てばルートパスにアクセスできます。
　
　
　
ざっくり解説でページを見れるまでやってきましたがいかがだったでしょうか？
とりあえず最初どうするんだっけな？というときにまた見てください！
また、間違っている箇所がありましたら適宜修正を行いますのでコメントでご指摘ください