Ruby on Rails チュートリアル第2章をやってみて　

#Toyアプリケーション

■第2章
大量の機能を自動的に生成するscaffoldジェネレータというスクリプトを使ってアプリケーションを作成する。それを元に、RailsプログラミングとWebプログラミングの概要を学んでいくそう。



## 2.1 アプリケーションの計画
まず、Toyアプリケーションをどのようなものにするか計画立てをする。

Railsのバージョン指定をして、アプリケーションの骨組み作成から始める。

```
$ cd ~/environment
$ rails _5.1.6_ new toy_app
$ cd toy_app/
```

その後はGemfileの中身を書き換えて、本番用のgemを除いたローカルgemをインストールする。

```
$ bundle install --without production
```

IDEでのRailsのバージョンと、Gemfileでのバージョンが違っていたせいでうまくできなかったです。自分でエラーが解決できるとなんか嬉しいですね。

最後に、GitでこのToyアプリケーションをバージョン管理下に置きます。

```
$ git init
$ git add -A
$ git commit -m "Initialize repository"
```

次に、Bitbucketで新しいリポジトリの作成。生成したファイルをプッシュする。

```
$ git remote add origin git@bitbucket.org:<username>/toy_app.git
$ git push -u origin --all
```

続いてアプリケーションコントローラに以下のコードを追加

```
def hello
    render html: "hello, world!"
  end
```

ルートルーティングを設定

```
Rails.application.routes.draw do
  root 'application#hello'
end
```

ファイルを変更したら、herokuにプッシュ。

```
$ git commit -am "Add hello"
$ heroku create
$ git push heroku master
```

```
# 省略
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !     Detected sqlite3 gem which is not supported on Heroku:
remote:  !     https://devcenter.heroku.com/articles/sqlite3
remote:  !
# 省略
```
こんな感じのエラーが出たので、以下のサイトを参照しました。
[Herokuへpushしたら"Detected sqlite3 gem which is not supported on Heroku"になったので、Gemfile直したけど、反映されないやつ](https://qiita.com/johnslith/items/bddc9032e03a411d0944)


###2.1.1 ユーザーのモデル設計

ユーザーには
・重複のない一意のキーとなるinteger型のID番号 (id)
・一般公開されるstring型の名前 (name)
・string型のメールアドレス (email)
の3つ持たせる。

###2.1.2 マイクロポストのモデル設計

マイクロポストのデータモデルは
・integer型のid
・マイクロポストのテキスト内容を格納するtext型のcontent
・投稿者を記録するためのuser_id


##2.2 Usersリソース
ユーザー用のデータモデルのデータ表示のため、Webインターフェイスに従って実装する。これらが組み合わさるとUserリソースになる。このUsersリソースはscaffoldジェネレータで生成する。

```
$ rails generate scaffold User name:string email:string
$ rails db:migrate
```

idパラメータはRailsによって自動的に主キーとしてデータベースに追加されます。

###2.2.1 ユーザーページを探検する
サーバーを立ち上げて

```
$ rails server
```

以下を表示すれば、色々なページが表示されるようになります。
・/users　すべてのユーザーを一覧するページ
・/users/1　id=1のユーザーを表示するページ
・/users/new　新規ユーザーを作成するページ
・/users/1/edit　id=1のユーザーを編集するページ

/usersを見てみるとこんな感じに
![スクリーンショット 2022-02-07 16.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2210462/cf49a6f1-1372-7aaf-adfc-04f24f21ea77.png)


###2.2.2 MVCの挙動

1章でも説明されたMVCモデルの挙動を、今回のアプリケーションに適用した説明がある。割愛。

ここで、「/」にアクセスしたらHello Wordldではなくて、ユーザー一覧を表示するようにルーティングを変更する。

```
変更前　root 'application#hello'
変更後　root 'users#index'
```

変更後にアクセスしたら、ユーザー一覧が表示されました。

###2.2.3 Usersリソースの欠点

scaffoldの問題点は
・データの検証が行われておらず、でたらめなデータでも通ってしまう。
・ユーザー認証がなく、誰でも無制限に操作できる。
・テストが十分に書かれてなく、必要な要求を満たしていない。
・レイアウトやスタイルが整っていない。
・理解が困難
などが挙げられる。

##2.3 Micropostsリソース
ユーザーの扱いをUsersで学んだので、投稿を扱うMicropostsの理解をする。


###2.3.1 マイクロポストを探検する
Micropostsリソースもscaffoldでコード生成。
rails generate scaffoldコマンドを使ってモデルの実装をする。

```
$ rails generate scaffold Micropost content:text user_id:integer
$ rails db:migrate
```

2.2と同様にデータベースの更新も行う。
そうすると、routes.rbに resources :microposts が追加された。

こんな感じでできました。
![スクリーンショット 2022-02-07 19.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2210462/2d4f99de-fafd-212e-e343-4ed3e866fac1.png)

###2.3.2 マイクロポストをマイクロにする

バリデーション(validation)を使って文字数制限を与える。
app/models/micropost.rbに以下のコードを記述

```
validates :content, length: { maximum: 140 }
```

ちゃんとエラーになりました。
![スクリーンショット 2022-02-07 19.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2210462/96ffe0c5-f31f-b77e-e0ec-d2f525bc35ab.png)

###2.3.3 ユーザーはたくさんマイクロポストを持っている
1人のユーザーに対し複数のマイクロポストがあるとする。
UserモデルとMicropostモデルを更新。

app/models/user.rbに次の記述を追加。

```
has_many :microposts
```

1つのマイクロポストは1人のユーザーにのみ属する場合
app/models/micropost.rbに次の記述を追加。

```
belongs_to :user
```

###2.3.4 継承の階層
Javaやってた時にもあったような、クラスの継承の話が出てきました。
いろんな言語触っておいて損はないんだなーと実感。

###2.3.5アプリケーションをデプロイする
Bitbucketに登録。

```
$ git status
$ git add -A
$ git commit -m "Finish toy app"
$ git push
$ git push heroku
$ heroku run rails db:migrate
```

##感想

慣れてきたのか、1章よりもスムーズにやることができました。
より高度MVCモデルもなんとなく理解できた気がします。
Scaffold機能でコードを自動生成して、モデルデータにアクセスしてやりとりするところは、応用情報の時のデータベースで見たような話もあって面白かったです。




##疑問・単語集
・bundle installとは　bundlerを使ってGemfileからgemをインストールするコマンドのこと

・REST　REpresentational State Transferの略。インターネットそのものやWebアプリケーションなどの、分散・ネットワーク化されたシステムやアプリケーションを構築する、アーキテクチャスタイルの一種。

・rails console rails の環境を読み込んだ状態でrubyコードを実行できるツール