Railsチュートリアル 第2章 - Toyアプリケーション - Usersリソースの挙動を変更する

# 前提

[Railsチュートリアル 第2章 - Toyアプリケーション - ユーザーページの挙動](https://qiita.com/drafts/0ee78427a41638747be8)からの続きです。

ホストは以下の状態であることを前提としています。

```:zsh
>>> pwd
~/docker/rails_tutorial_test/toy_app
```

Rails用のDockerコンテナが実行されており、以下の状態であることを前提としています。

```:bash
# pwd
/var/www/toy_app

# rails server
=> Booting Puma
=> Rails 5.1.6 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.9.1 (ruby 2.5.1-p57), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

{この時点の状態}
```

# 現時点における`git status`と、それに対して私がとった対処

`rails generate scaffold`の実行以降にGitのコミットは行っていないため、この時点で`git status`には「Changes not staged for commit」として出現します。

```:zsh
>>> git status

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   config/routes.rb

Untracked files:
...略
```

私は、一旦この時点で`toy_app`以下の全てのファイルをGitの追跡対象とした上でコミットしました。

# Railsアプリケーションにおいて、特定のURLで示されたリソースをブラウザで開くとき、アプリケーション内部では何が起こっているのか

「/users にあるindexページをブラウザで開く」という操作をしたときのRailsサーバーの挙動について、Railsチュートリアルには以下のようにあります。

> 1. ブラウザから「/users」というURLのリクエストをRailsサーバーに送信する。
> 2. 「/users」リクエストは、Railsのルーティング機構 (ルーター) によってUsersコントローラ内のindexアクションに割り当てられる。

このうち、「Railsのルーティング機構 (ルーター) 」の挙動について記述する設定ファイルが、`config/routes.rb`であるということになります。

## `config/routes.rb`の記述

現時点におけるRailsサーバー内の`config/routes.rb`には、以下のような記述があります。

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :users
  root 'application#hello'
end
```

`resources: users`というのは、`rails generate scaffold`により自動で生成される、`users`リソースに対する複数のルーティングを自動で定義するための処理です。[初心者じゃなくても役に立つかもしれないRailsのroutingの記述方をまとめてみた - まっしろけっけ](http://shiro-16.hatenablog.com/entry/2015/03/19/001656)というBlog記事に、`resources: users`で自動作成されるルーティングの一覧について記載があります。

一方、`root 'application#hello'`というのは、「/」を開いたときのルーティングの定義についての記述となります。Railsチュートリアルの本文に記載されているとおり、「Applicationコントローラ内の`hello`アクションにルーティングされる」という動作をします。

## 「/」を開いたときの動作を変更する

今回ソースコードを書き換えて実現したい処理は、Railsチュートリアルに記載された以下の処理です。

> サーバーのルートURLにアクセスしたら、デフォルトのページの代わりにユーザー一覧を表示するようにします。つまり、「/」(スラッシュ) にアクセスしたら/usersを開くようにします。

`config/routes.rb`の内容を、以下の差分で示すとおりに変更すれば、期待する動作が実現できるはずです。

```diff:config/routes.rb
 Rails.application.routes.draw do
   resources :users
-  root 'application#hello'
+  root 'users#index'
 end
```

実際に以上の変更を行った上で、改めて「/」にアクセスしてみます。

<img width="846" alt="スクリーンショット 2019-08-01 16.57.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323778/6f7c1610-ef8d-477c-7d78-d7a560424a49.png">

期待する動作が実現できているようです。このとき、`rails server`は以下のメッセージを返しました。

```
Started GET "/" for 172.17.0.1 at 2019-08-01 07:57:08 +0000
Cannot render console from 172.17.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by UsersController#index as HTML
  Rendering users/index.html.erb within layouts/application
  User Load (6.7ms)  SELECT "users".* FROM "users"
  Rendered users/index.html.erb within layouts/application (54.8ms)
Completed 200 OK in 632ms (Views: 472.4ms | ActiveRecord: 29.5ms)
```
`users/index.html.erb`という、いかにも`users#index`と関係ありそうなリソース名が登場していますね。また、ユーザーデータを一覧表示するため、`SELECT "users".* FROM "users"`というSQL文が呼び出されています。