Railsにおけるリクエストからレスポンスまでの流れについて(GET編・POST編)

## はじめに
Railsの処理の流れの基本が理解できてなかったので、
シーケンス図を作ってフローを解説してみました。

## GET編
とあるSNSアプリがあります。ユーザーの一覧ページがブラウザに表示されるまでの流れを説明してください。なお、以下の言葉を使うことを条件とします。

/users (← URLです)
GET
コントローラ
routes.rb
モデル
ビュー
データベース

1\. クライアントは、ブラウザで/usersというURLにアクセスする
2\. HTTPメソッドのGETでサーバへリクエストを送る
3\. それを受け取ったサーバはroutes.rbファイルに定義されているルーティングに基づき、それに対応するコントローラとアクションを特定し、呼び出す

```ruby:config/routes.rb
get '/users', to: 'users#index'
```
この場合、/usersへのGETリクエストはUsersControllerへ、そしてその中で定義されているindexアクションを呼び出す

4\. アクションは必要なデータを処理し、Userモデルを介してデータベースからusersの全ユーザーを取得し、インスタンス変数@usersへ格納する
```ruby:users_controller.rb
 def index 
   @users = User.all
 end
 ```
コントローラ内で定義され、データが格納されたインスタンス変数(@users)はビューの中で参照できる

5\. コントローラは、ユーザー一覧データが格納された@usersをビューに渡し、
アクションに対応したビューファイル(app/views/users/index.html.erb)が呼び出され、
erbという形式のテンプレートを使ってHTMLを作成する

6\. 作成したHTML(app/views/users/index.html.erb)をクライアントに返し、ブラウザに表示される

シーケンス図↓

![GET編](https://scrapbox.io/files/65bed5593876160025f9d9f0.png)


## POST編

Railsにおけるリクエストからレスポンスまでの流れについて(POST編)
とあるタスク管理アプリがあります。タスクを新規作成するときの流れを説明してください。
以下のような要件とします。

新規作成ページを表示する
タスク名(name)を入力する
作成ボタンを押す
タスクの詳細画面に遷移する
なお、説明にあたり以下の言葉を使うことを条件とします。

/tasks/new (← URLです)
/tasks (← URLです)
GET
POST
コントローラ
routes.rb
モデル
ビュー
データベース
params

1\. クライアントは、ブラウザで/tasks/newというURLにアクセスする
2\. HTTPメソッドのGETでサーバへリクエストを送る
3\. それを受け取ったサーバはroutes.rbファイルを参照し、
'/tasks/new'へのGETリクエストが指し示すコントローラ(TasksController)とアクション(new)を呼び出す
```ruby:config/routes.rb
 get '/tasks/new', to: 'tasks#new'
```

4\. Taskモデルを介してタスクのデータを入れるインスタンスを生成し、
インスタンス変数@taskへ格納する(CRUD操作はしない)
```ruby:tasks_controller.rb
 def new
   @task = Task.new
 end
```

5\. コントローラは@taskをビューに渡し、アクションに対応したビューファイル(app/views/tasks/new.html.erb)が呼び出され、erbという形式のテンプレートを使ってHTMLを作成する

6\. 作成したHTML(app/views/tasks/new.html.erb)をクライアントに返し、ブラウザへ表示

7\. タスク入力フォームにタスク名を入力し作成ボタンを押すと、
クライアントが/tasksというURLに`POST`メソッドでリクエストを送信

8\. routes.rbファイルで/tasksに対するPOSTリクエストが指定されたTasksController、createアクションを呼び出す
```ruby:config/routes.rb
 post '/tasks', to: 'tasks#create'
 ```

9\. createアクションが実行され、paramsハッシュ(指定した属性のみを許可したtask_paramsメソッド)からフォームのデータが取り出され、新しいタスクのインスタンスを作成
```ruby:tasks_controller.rb
 def create
   @task = Task.new(task_params)
 
   if @task.save
     redirect_to task_path(@task), notice: 'タスクが作成されました。'
   else
     render :new
   end
 end
 
 private
 
 def task_params
   params.require(:task).permit(:name)
 end
```
インスタンス変数@taskに対してsaveメソッド(保存するできたかどうかを返すboolean型)を呼び出し、データが格納できたかを返す
その際、内部的には
`INSERT INTO tasks`
でモデルからデータベースへデータの保存が試みられる

a-1\. 保存が成功(if @task.saveでtrueが返される)であれば、
`redirect_to task_path(@task)`が実行&GETメソッドでリクエストが送信される

a-2\. ルーティングによりTasksControllerのshowアクションが呼び出され、
```ruby:tasks_controller.rb
 def show
   @task = Task.find(params[:id])
 end
```

リクエストされたidに対応するタスクがデータベースから取得され、@taskに格納される
内部的には、
`SELECT * FROM tasks WHERE id = :id`
で取得する

a-3\. コントローラは、showアクションで取得した詳細情報を表示するための@taskオブジェクトをビューに渡し、HTMLを作成する

a-4\. 作成したHTML(app/views/tasks/show.html.erb)をクライアントに返し、ブラウザにタスクの詳細ページが表示される

b\. 保存が失敗(if @task.saveでfalseが返される)であれば、
`render :new`でレンダリングされ、tasks/new.html.erbを使ってHTMLを組み立て、
新規作成ページが再表示される(エラーメッセージも表示される)

![POST編](https://scrapbox.io/files/65bf059e8511630025d59f53.png)

## さいごに
Railsの処理の流れがある程度掴めて良いインプットとアウトプットになりました。
そして、基本に立ち返ることができたので、これを活かしてRailsでアプリケーション開発していきたいです。