チーム開発体験会でやったこと＆感想【rails勉強会】

rails勉強会で行ったことまとめ。
今回のrails勉強会ではチーム開発体験を行いました。
超劣化版ツイッター作成くらいに思っていただければ結構です。

ユーザーがいて、コメントができる。
簡単なアプリケーションです。

時間が40分くらい。

一人でも作れちゃう。
いや
そっちの方が早いのではないか？と思うアプリを
40分という短い時間で作ります。

短い時間のためか、
**人が増えることによって「大変だなぁ」と思う部分だけ見える会**
だと思います。

私は助けてもらった側なのでありがたかったです。ハイ。

これは悪い意味ではなく、悪いところだけ見えるからこそ、対策できるってこと？
と思いましたけど実際のところどうなんですかね。（未確認）

#①railsを新規作成
```ターミナル
$ rails _5.2.2.1_ new mini_app -d mysql
```
まずはrails環境を構築したいフォルダに移動し、
「mini_app」というディレクトリでrails構築するコマンドを入力します。

この時、**「-d mysql」**をつけることで、mysqlにデータベース登録を同時に行えます。
あとからmysql登録もできるようですが、このやり方はご自身で調べてください。

先輩に聞いた話だと、後からmysqlを導入すると、ところどころ齟齬が出てその度
に修正をして時間がかかったそうなので、この**「-d mysql」**を忘れてしまった場合には作り直した方が手っ取り早いかもしれません。


#②deviseの導入とモデルの作成
[[初心者] deviseを使ってログイン機能を実装してみよう](https://qiita.com/Orangina1050/items/a16e655519a60f35b394)
上記の記事を参考にveviseを導入しました。

**※ひとつでも手順を飛ばしたり、順序を間違えると正常に動作しないため慎重に！**
※何度も失敗した人間のありがたいお言葉

お手本のmini_appにはログインユーザの「名前」がなかったため、
作成したマイグレーションファイルに追記せずそのまま**rake db:migrate** すれば問題ありません。
チャットスペースではこのモデルに「name」というモデルを追記するくだりがあるので気をつけてください。

上記を行ってできたテーブルは下記となります。

<img width="953" alt="9f79fd5b79ce334300a9d7587c11e9f7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/311440f8-0718-9154-1fb0-c4237a7e1305.png">

#③tweetsモデル作成
```ターミナル
$ rails g migration tweets
```
上記のコマンドでマイグレーションファイルが作成されます。

```20191020064311_create_tweets.rb
#$ rails g migration tweets　で作られたマイグレートファイル
class CreateTweets < ActiveRecord::Migration[5.2]
  def change
    create_table :tweets do |t|
      t.text :text #この1行を追加しました
      t.timestamps #もともとあります。作成日と更新日の部分です
    end
  end
end
```

#④tweetsにuser_idを持たせる
③でマイグレートした状態では、tweet（コメント）には持ち主がいない状態になってしまうので、
TweetsにUserを紐付けるために、tweetsテーブルに「user_id」を紐付けます。

```ターミナル
$ rails g migration AddColumnToTweets user_id:integer
#AddColumnToTweets →　Tweetsカラムに
#user_id:integer →　user_idをinteger型で追加する
```
integer型は正数っていう意味で、IDとかに使われるらしいですよ。

上記のコマンドを入力すると、マイグレートファイルが作成されます。

```20191020070028_add_user_id_to_tweets.rb
#$ rails g migration AddColumnToTweets user_id:integer で作られたマイグレートファイル
class AddUserIdToTweets < ActiveRecord::Migration[5.2]
  def change
    add_column :tweets, :user_id, :integer
  end
end
```
特に修正せずにrake db:migrateすればOK！
もし、コマンドを間違えてしまってマイグレートファイルの内容が違っていても、
マイグレートファイルを修正してrake db:migrateすれば大丈夫です。

<img width="959" alt="c0290b3b721cf80273740f739ba0194a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/b3e10d50-2020-69c1-352b-0a001587d24d.png">

#⑤モデルファイルにアソシエーションを追記する
上記で２回マイグレートしまして、「tweet.rb」「user.rb」が一緒に生成されています。
このファイルにアソシエーションを追加します。

belongs :tech →　techに属している（単数形）
has_many :students　→　生徒たち（複数形）

とかいうやつです。ってな感じで細かい説明は省きまして、今回設定したアソシエーションは下記

```user.rb
#②で作成されます
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :tweets #これを追記
  
end
```
```tweet.rb
#③で作成されます
class Tweet < ApplicationRecord
  belongs :user #これを追記
end

```

これでベースは整いました。多分。

#⑥ブラウザで見られるようにする
ここまでの状態ではまだブラウザで見れません。
超基本的な部分ですが、ルーティング・コントローラー・ビューの設定を行います。

```ターミナル
$ rails g controller tweets index
```
上記のコマンドを入力して実行すると、routesに1行追加され、
コントローラーとアクションを一緒に作成できます。

```config/routes.rb
Rails.application.routes.draw do
  get 'tweets/index' #⑥のコマンドで追加されたもの
  devise_for :users #②のコマンドで追加されたもの
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

```app/controllers/tweets_controller.rb
#⑥のコマンドで生成されたもの
class TweetsController < ApplicationController
  def index
  end
end
```

```app/views/tweets/index.html.erb
<!-- ⑥のコマンドで生成されたもの -->
<h1>Tweets#index</h1>
<p>Find me in app/views/tweets/index.html.erb</p>

```

#⑦ブラウザで確認する

```ターミナル
$ rails s
```

<img width="511" alt="e62a269e2108ce88f0073c40bfc7efc4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/662f4926-ca7a-64a5-b082-d8918fd79c99.png">

無事にブラウザで表示することができました。

**ここでタイムアップ！**

#チーム開発体験の感想
チーム開発体験で学んだこと。

- リーダーとスクラムマスターを決める
    - 短い時間だったらとっとと決めた方がいいと思ってる。
    - 実際のグループ開発の時は話し合ってちゃんと決めたい。
- どうやって開発するか流れを決める
    - 今回はビュー組とDB組に別れた
    - 短時間の場合は上記の方法が良いと思った
    - 実際のグループ開発の際にはグループ内の環境構築が全く同じであることが重要だと思った
- 実際に開発する
    - ガッチャンコするところまで行けなかった
    - ここら辺の方針はグループ開発の際にしっかり決めたいなと思った。

先輩に話を聞いたんですが、誰かがベースの環境構築をして、
それをgit cloneして足並み揃える方式でやっているようです。

#まだ時間があったらどうするか？
1. 作ってもらったビューを「application.html.erb」にあてがい表示を確認
2. 上記の状態をgitを使用してcloneしてもらう
3. 「tweet」組と「devise」組に別れる。
4. 影響範囲が少ないところからガッチャンコして調整する
5. 部分テンプレート化した方が良さそうなところは対応する
6. リファクタリングする

上記のような優先順位で対応したらいいんじゃないかな〜？と感じました。
勉強会でチームになった方、ライフコーチ方ありがとうございました！