Help us understand the problem. What is going on with this article?

Railsのルーティングについて整理

More than 1 year has 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と関係がある場合だかなんだかあるらしいがよくわからなかったので勉強しなおしてまた編集したいと思う。

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

sibakenY
大学卒業後Ruby, Ruby on Railsを勉強しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした