基礎Ruby on Rails Chapter3 コントローラ

前 [基礎Ruby on Rails Chapter1 ディレクトリ構造・コントローラ・アクション・ビューの作成](https://qiita.com/tseno/items/6ce3c3b3a4724ac6215e)
次 [基礎Ruby on Rails Chapter3 テンプレート](https://qiita.com/tseno/items/e6587a28cc80a0341636)


### ルーティングの詳細

トップページを指定する。

```ruby:config/routes.rb
root "home#index"
```

- GETメソッドで呼び出す。「get "パス" => "コントローラ名#アクション名"」
- POSTメソッドで呼び出す。「post "パス" => "コントローラ名#アクション名"」
- 「コントローラ/アクション名 => "コントローラ名#アクション名"」の場合は、簡略化できる
- asオプションで名前を付ける。コントローラやビューでhelp_pathというメソッドを呼び出すと"/help"という文字列が返る。
- 「:パラメータ名」でパラメータをパスの中に埋め込める。showアクションが呼び出され、params[:year]、params[:month]でパラメータが取り出せる。


```ruby
get "about" => "top#about"
post "login" => "sessions#login"
get "info/company"  # 簡略形式
get "help" => "documents#help", as: "help"  # asオプションで名前を付ける
get "articles/:year/:month" => "articles#show"  # パラメータ埋め込み
```

### コントローラクラスの書き方

ApplicationControllerのサブクラスとする。

```ruby:top_controller.rb
class TopController < ApplicationController 
  before_action :prepare

  def index
    # アクション。ビューはindex.html.erb
  end

  def about
    # アクション。ビューはabout.html.erb
  end

  private
  def prepare
    # プライベートメソッド
  end
```
### 命名規約

- コントローラの命名規約
    - クラス名 MembersController (〇〇Controller 先頭は大文字)
    - ファイル名 members_controller.rb (〇〇_controller.rb)
    - テンプレートのディレクトリ名 app/views/members (app/views/〇〇)
- モデルの命名規約
    - テーブル名 members (先頭は小文字。複数形)
    - モデルクラス名 Member （先頭は大文字）
    - モデルクラスのファイル名 member.rb (〇〇.rb)

## アクションで使える機能

### 練習の準備

asagaoプロジェクトにlessonコントローラを追加する。

```sh
$ bin/rails g controller lesson
```

「/lesson/step番号」というパスでLessonControllerのstep1～18までのアクションを呼び出せるようにする。
:nameという名前のパラメータを使えるようにする。

```ruby:config/routes.rb
Rails.application.routes.draw do
  root "top#index"
  get "about" => "top#about", as: "about"
  # 以下を追加。step1-18までのアクションを呼び出せるようにする。
  1.upto(18) do |n|
    get "lesson/step#{n}(/:name)" => "lesson#step#{n}"
  end
end
```

- step1

lesson_controller.rbに、def step1を追加する。

```ruby:lesson_controller.rb
class LessonController < ApplicationController
  def step1
    render plain: "こんにちは、#{params[:name]}さん"
  end
end
```

http://localhost:3000/lesson/step1/sato を開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/d954bd6b-ee7b-97d5-5759-53d22fb6ae02.png)

- step2

```ruby:lesson_controller.rb
  def step2
    render plain: params[:controller] + "#" + params[:action]
  end
```

http://localhost:3000/lesson/step2 を開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/fc1901d3-3b90-73ee-a191-211701f4dd3a.png)

## リダイレクション

- step3, step4

```ruby:lesson_controller.rb
  def step3
    # step4にリダイレクトする。(pathでも可)
    redirect_to action: "step4"
    # redirect_to "lesson/step4"
  end

  def step4
    render plain: "step4に移動しました。"
  end
```
http://localhost:3000/lesson/step3 を開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/061e6460-7027-67ef-4b10-4b88b3731122.png)


### フラッシュ

- step5,6

```ruby:lesson_controller.rb
  def step5
    # リダイレクション後のアクションで文字列を取り出すことができる。
    flash[:notice] = "step6に移動します。"
    redirect_to action: "step6"
  end

  def step6
    render plain: flash[:notice]
  end
```

http://localhost:3000/lesson/step5 を開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/020622c2-a6ec-0fa1-3208-977c1c372119.png)


参考
[改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)](https://www.amazon.co.jp/%E6%94%B9%E8%A8%824%E7%89%88-Ruby-Rails-IMPRESS-KISO/dp/429500460X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1536666358&sr=1-1)