Railsのルーティングの記述方法

#概要
Railsでルーティングを設定する際、私が勉強したことを復習の意味も込めてまとめてみます。
#ルーティングとは
Railsにおけるルーティングとは、リクエストされたURLからコントローラとアクションを選択することです。
#ルーティングの設定方法
config/routes.rbファイル内にて設定を記述し、その内容がルーティングの設定となります。

```ruby:config/routes.rb
Rails.application.routes.draw do
  #ここにルーティングを記載
end
```
#ルーティングの記述方法
基本は「メソッド "パス" => "コントローラ#アクション"」にて記載する。

```ruby:config/routes.rb
Rails.application.routes.draw do
  #例
  get "about" => "top#about"
  post "login" => "sessions#login
end
```

コントローラ#アクションがパスと同じ場合、省略が可能である

```ruby:config/routes.rb
Rails.application.routes.draw do
  #例
  get "info/room"
end
```

asオプションを付ければルーティングに名前を付けることができる。"指定した名前_path"をメソッドとして呼び出すと"/指定した名前"で文字列を返す。

```ruby:config/routes.rb
Rails.application.routes.draw do
  #例
  get "help" => "document#help", as: "help"
end
```

":パラメータ"と記載すると、パラメータをパスとして使用することができる。

```ruby:config/routes.rb
Rails.application.routes.draw do
  #例
  get "posts/:year/:month" => "posts#show
end
```
#リソースベースのルーティングの記述方法
リソースベースでルーティングを設定するにはresourcesメソッドを記載し、リソース名を複数形にします。
また、単数リソースでルーティングを設定するにはresouceメソッドを記載し、リソース名を単数形にします。
Railsのリソースベースとは、RESTに基づきコントローラで扱う対象に名前をつけたものです。

```ruby:config/routes.rb
Rails.application.routes.draw do
  #例
  resources :users
  # get "users" => "users#index"
  # get "users/:id" => "users#show"
  # get "users/new" => "users#new"
  # get "users/:id/edit" => "users#edit"
  # post "users" => "users#create"
  # patch "users/:id" => "users#update"
  # delete "users/:id" => "users#destroy"
  resource :account
  # get "account" => "account#show"
  # get "account/new" => "account#new"
  # get "account/edit" => "account#edit"
  # post "account" => "account#create"
  # patch "account" => "account#update"
  # delete "account" => "account#destroy"
end
```
resourcesメソッドで作ったルーティングに追加でアクションを追加する場合は、ブロックで囲み、その中で新たにメソッド、アクションを追加で記述します。
追加のアクションが集合を表す場合は、"on: :collection"、id属性を追加する場合は、"on: :member"を設定します。

```ruby:config/routes.rb
Rails.application.routes.draw do
  #例
  resources :users do
    get "search", on: :collection
    patch "suspend", "restore", on: :member
  end
end
```

resourcesメソッドで作ったアクションの内、必要のないアクションはonlyオプションやexceptアクションを渡し、アクションを設定します。

```ruby:config/routes.rb
Rails.application.routes.draw do
  #例
  resources :users, only: [:index, :show]
  resources :users, except: [:show]
end
```

#パスの指定
ルーティングで設定したパスはlink_toメソッドやredirect_toメソッドにてパスで指定できます。
例：リソース名 users

| アクション |      URL       |　　      パス      　　|
|:--------:|:--------------:|:--------------------:|
| index    | users          | users_path           |         
| show     | users/:id      | user_path(user)      |      
| new      | users/new      | new_user_path        |       
| edit     | users/:id/edit | edit_user_path(user) |         
| create   | users          | users_path           |       
| update   | users/:id      | user_path(user)      |       
| destroy  | users/:id      | user_path(user)      |

```:~view.html.erb
<%= link_to "一覧", users_path %>
```

引数にモデルオブジェクトを渡すとidパラメータを取得することができます。
また、methodオプションを使えば、HTTPメソッドを区別できます。

```:~view.html.erb
<%= link_to "削除", user_path(@user), method: :delete %>
```

#パスの簡略化
簡略化したパスの指定もできます。
第２引数にモデルオブジェクトを渡すとidパラメータを持ったパスと同じパスに変更できます。

```:~view.html.erb
<%= link_to "削除", users_path(@user), method: :delete %>
     ↓
<%= link_to "削除", @user, method: :delete %>
```

個別リソースを扱うアクションは[:アクション名, モデルオブジェクト]で設定できます。

```:~view.html.erb
<%= link_to "編集", edit_user_path(@user) %>
     ↓
<%= link_to "編集", [edit, @user] %>
```

idのいらないリソースを扱うアクションは"_path"を省略し、シンボルにすると設定できます。

```:~view.html.erb
<%= link_to "一覧", users_path %>
     ↓
<%= link_to "一覧", :users %>
```

#まとめ
ルーティングとパスについて改めて理解を深めました。
ルーティングやパスは簡略化した状態でプログラムを書くことが多いので、本来の形を忘れがちになってしまうので、今回復習できてよかったです。
まだまだ細かく調べるとルーティングの設定方法はあると思うので、必要に応じて追加でまとめていきたいです。