7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

#初めに
Railsのルーティングについて曖昧でなんとなくやっていたので知識を整理する

#resourceとresources

resourceとresourcesはどちらも自動で基本的に使うルーティングを設定してくれます。

例えば

resources :cats とすれば

                     cats GET    /cats(.:format)                                cats#index
                          POST   /cats(.:format)                                cats#create
                  new_cat GET    /cats/new(.:format)                            cats#new
                 edit_cat GET    /cats/:id/edit(.:format)                       cats#edit
                      cat GET    /cats/:id(.:format)                            cats#show
                          PATCH  /cats/:id(.:format)                            cats#update
                          PUT    /cats/:id(.:format)                            cats#update
                          DELETE /cats/:id(.:format)                            cats#destroy


と設定してくれる。

基本的に複数あるものに対してのルーティングに使われる

逆にresourceは

                 new_cats GET    /cats/new(.:format)                          cats#new
                edit_cats GET    /cats/edit(.:format)                         cats#edit
                     cats GET    /cats(.:format)                              cats#show
                          PATCH  /cats(.:format)                              cats#update
                          PUT    /cats(.:format)                              cats#update
                          DELETE /cats(.:format)                              cats#destroy
                          POST   /cats(.:format)                              cats#create


という感じで複数無いことが前提になっているのでidを指定することがないルーティングになっている。

ちなみにresourcesは

resources :users, :posts, :groups

みたいに設定できるっぽい

#resourcesの制限

resourcesでつかうpathに制限を付けれて
resourcesで使うアクションに制限を付けれる。
同じpathに複数のpathが割り当てられているのでpathに制限をかけているわけではない。

resources :cats, only: [:index]
resources :cats, except: [:index]

こんな感じに設定する
onlyは指定したのだけexceptはそれ以外

#ヘルパーメソッドについて

ヘルパーメソッドはcats_path とか new_cat_pathみたいな感じでルーティングを指定できるもののこと

ヘルパーメソッドはcats_pathで/catsやcat_pathで/cats/:idといったパス文字列を生成するもの

link_to や redirect_toなどにurlを直接書かないほうがなんか良いらしいのでこのようにヘルパーメソッドを使ったほうが良い。

ちなみにresourcesに対してのヘルパーメソッドはそれぞれ

index => cats_path
show => cat_path(@cat)
new => new_cat_path
create => cats_path
edit => edit_cat_path
update => cat_path(@cat)
destroy => cat_path

index,create,destoryはヘルパーメソッドが同じだメソッドがgetかpostかdeleteかで何を行うかを識別している。

#AS

ルートには名前を付けることができて

get 'cats/index', as: 'hello_world'

こんな感じで設定すると

hello_world_pathでcats/indexにアクセスしてくれる。

hello_world_pathでcats/indexというパス文字列を作成してくれる。

#namespace

namespaceを使うとurlの前に任意のpathを入れれる。
説明が下手だけと見れもらえばわかる

namespace :admin do
  resources :cats
end 

とするとルートは

           new_admin_cats GET    /admin/cats/new(.:format)           admin/cats#new
          edit_admin_cats GET    /admin/cats/edit(.:format)          admin/cats#edit
               admin_cats GET    /admin/cats(.:format)               admin/cats#show
                          PATCH  /admin/cats(.:format)               admin/cats#update
                          PUT    /admin/cats(.:format)               admin/cats#update
                          DELETE /admin/cats(.:format)               admin/cats#destroy
                          POST   /admin/cats(.:format)               admin/cats#create

こんな感じにすべてadmin/が最初につく

ちなみにこれに対応するようなコントローラーを作りたい場合は

rails g controller Admin::cats

みたいにする

またルートの設定をcontrollerごとにまとめれるようで

controller :cats do 
    resources :cats 
  end 

  controller :dogs do 
    resources :dogs 
  end 

こんな感じに書くこともできる

#終わりに
scopeとnamespaceの違いがnamespaceはcontrollerと関係がある場合だかなんだかあるらしいがよくわからなかったので勉強しなおしてまた編集したいと思う。

また何か間違っているところがあればご指摘いただければと思います。

7
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?