ルーティングに対してあまりにも無知だったため、ルーティングの勉強をすることにした

# 個人的メモです、以下サイトの内容をメモしただけなので是非そちらを
参考URL一覧
こちらの記事を中心に勉強しましたので是非こちらをごらんください。
* http://techracho.bpsinc.jp/hachi8833/2014_03_03/15619
* http://www.rubylife.jp/rails/routing/

#　ルーティングの設定方法
config/routes.rb
このファイルをいじる

#確かめる方法
* コンソールからrake routes
* rails consoleを起動しておいて show-routesを実行すると早い
* rails consoleで app.clients_path のように app. の後ろにパスを記述してもチェック可能
* サーバを立ち上げておいて　/rails/info/routes　にアクセスしても見れる
* サーバを立ち上げておいて /あqwせdrftgyふじk　にアクセスしてエラーを出しても見れる

4つ目のやつが色々な機能があって確認するのには便利

# railsのルーティング規約のRESTとは
直訳：表現状態再転送　（強そう
Re:presentational State Transfer 
要するにRailsのルールのひとつ

* ステートレス　　　　：同じ入力に対する出力は常に同じになる　＝　冪等性(べきとうせい）がある　
* 全てをリソースで表現：resources :products　と定義する
* リソースは名前を持つ：products_path　　　と指定すれば利用出来る

###作り方
```rb:routes.rb
#必ずresourcesで定義する必要がある、むしろresourcesで定義すればresetになる
resources :products
```

###対極の概念RPC
URLの後ろに色々つけてどうにかしようとするやつ
/admin?action=prefecture_list&id=1
RESTはあくまでレールの一部なので必ずしもRESTで作るべきというわけではない


###RESTではなくHTTPメソッドを用いたルーティングの書き方
このようにも書けるらしい

```rb:HTTPメソッドを用いて定義するルーティング
get 'hello1', to: 'pages#hello'
get 'hello2', :controller => 'pages', :action => 'hello2'
get 'hello3/:id', to: 'pages#hello3'
post 'hello4', to: 'pages#hello4'
```


# 理解しておくべき単語
* リソース：操作対象のURL
* 名前付きルート：パスヘルパー、URLヘルパーとも呼ばれ、hoge_path,hoge_urlなどでアクセスできるようにするやつ
* ネストしたリソース：あるリソースを他のリソースの子にすること

###\_path と\_urlの違い
* \_pathは  /clients/info  などのドメイン名から下のパスを指定したことになる
* \_urlは  http://localhost:3000/index  などから始まるフルパス

#resourcesとresource　複数形と単数系　普段は複数形を利用する

```rb:複数形
resources :clients
```
と記述するとclient関連の基本的に使われるメソッドが生成される
![image](https://qiita-image-store.s3.amazonaws.com/0/69647/1dee7606-b21d-9215-214c-0546f8d1e510.png)

```rb:単数系
resource :prefecture
```
単数系だと：idが含まれない　＝＞　つまりclient.idが1番のユーザーの編集などの複雑なルーティングができなくなる。
単純なページアクセスの場合に利用する
![image](https://qiita-image-store.s3.amazonaws.com/0/69647/698a301e-c3ab-12bf-038f-3e9b736d4860.png)

単数系で指定して、consoleからpathを確認したら
![image](https://qiita-image-store.s3.amazonaws.com/0/69647/d8587d2a-b2ad-50ed-1071-7696041b410d.png)
app.admin_client_path　では正常
app.admin_client_path(1)　とidを指定すると見慣れないurlが生まれる

#ルーティングのネストを行い複雑なルーティング設定を行う
```rb:routes.rb
#resources :clientsだけで生成されるルーティングは /clients/:id　である　（複数形だから）
resources :clients do
  #ネストすると　/clients/:id/password になり、クライアントのパスワード設定ページへのルーティングを行える
  resource :password
end
```
ネストすることによってclients/:id/passwordを生成できる、用途としては
クライアントidが1番のアカウントのパスワードを設定するページを新規に作る時などに利用出来る。
![image](https://qiita-image-store.s3.amazonaws.com/0/69647/bb8f3248-77eb-077f-c0cf-4d3f17a539ed.png)

#namespaceによる urlの仕切りを作成する
例：管理者、クライアント、一般ユーザー　の3者それぞれのマイページのurlを分けることもできる
admin/mypage
client/mypage
user/mypage

```rb:routes.rb
#管理者
namespace :admin do
  resources :mypage
end
#クライアント
namespace :client do
  resources :mypage
end
#一般ユーザー
namespace :user do
  resources :mypage
end
```
今まで張っていた画像全てに/adminがついているのはnamespaceが設定されているからである。


#自動生成される７つのアクション以外へのルーティングを設定する
##collectionとmemberというのを定義するとサクッと設定できます
resoucesで自動的に作成される７つのコントローラーへのルーティングですが、
それ以外のメソッドをコントローラーに追加したい時にはcollectionかmemberを利用することで実現できます。

```rb:routes.rb
resources :clients do
  #コントローラーの新しいメソッド（idが不要な場合はcollection）
  collection do
    #全データ削除や検索には個別のIDは不要なのでcollection
    post:reset_all
    post:search
  end

  #コントローラーの新しいメソッド（idが必要な場合はmember）
  member do
    # そのクライアントのデータを初期化する作業や、初期データなどを入れる場合はidを利用するのでmember
    get :reset_data
    get :set_base_data
  end
end
```
以下のようにclientsコントローラーのreset_all_dataに紐づくルーティングが生成されました！
![image](https://qiita-image-store.s3.amazonaws.com/0/69647/dcbf6262-c0c9-b944-867b-f3a5da567a62.png)


あとはコントローラー側でメソッドを定義し、viewを作成、またはすでにあるviewにredirect_toすれば新機能を追加できます