Ruby on Railsのルーティング

Ruby on Railsのルーティング

Ruby on RailsのURLマップについて。
config/routes.rb に記述するんですが、Rubyって記述方法に省略系が多くて混乱することが多いので自分用に纏め。
Rails本家のガイドの Railsのルーティング も分かり易かった。頭捻ってた時は何故かこのガイドにたどり着けませんでした。
routes.rbの記述は基本以下のようになってます。

get 'users', to: 'users#index'

getはhttpdのGETメソッド。他にPOSTとかPUTとかDELETEとかですね。
'users’がパス。これだとhttp://localhost:3000/users になります。
to: の ‘users#index’ は controller のクラス#メソッドです。
この場合は ./controller/users_controller.rb の indexメソッドになります。

基本

> rails generate controller Users index

などでコントローラーを作ると routes.rb には以下のように追加されます。

get 'users/index'

これは以下と同義です。

get 'users/index', to: 'users#index'

更に/indexは省略できますね。to:はコントローラ#アクションのとなりますが、更に以下のようにも記述できます。

get 'users/index', controller: 'users', action: :index

:indexのようなものはシンボル、通常はハッシュマップにアクセスする際に使いますが、以下のようにするとusersのindexメソッドが呼べますのでメソッドを表す場合にも使用されるようです。

obj = Users.new
obj.send(:index)	# これでobj.index()と同じ

でも文字列でも同じことできますよね。

obj = Users.new
obj.send('index')

この文字列使ったりシンボル使ったりするのやめません?と言いたい。
なんか意味あるのかな。実際上記は以下のように書いても問題ないです。

get 'users/index', controller: 'users', action: 'index'

resources

以下のようにscaffoldでコントローラーを作った場合はroutes.rbにresourcesが追加されます。

> rails generator scaffold User

とかで作成するとroutes.rbには以下が追加されますね。

resource :users

何コレと思ったんですが、上記は以下の省略となります。

get 'users', to: 'users#index', as: 'users'
post 'users', to: 'users#create'
get 'users/:id', to: 'users#show', as: 'user'
patch 'users/:id', to: 'users#update'
put 'users/:id', to: 'users#update'
delete 'users/:id', to: 'users#destroy'

自分はプロジェクト作る時に --api を付けてるのでこうなってます、–apiなしの通常のWebアプリだと更に new と edit のアクションもあります。
as: の部分はPrefixになるんですが、Prefix自体あまりよく理解しておらず --api で作った場合はあまり関係なさそうなので省力してもOKです。

indexとshowだけにしたい場合はonlyを使用します。

resources :users, only:[:index, :show]

逆にupdateとdestroyを削除したい場合はexceptを使用します。

resources :users, except:[:update, :destroy]

デフォルト以外のアクションを追加したい場合はmemberを使用します。

resources :users do
  member do
    get 'preview'
  end
end

以下と同義のパスが追加されます。

get 'users/:id/preview', to: 'users#preview'

:idを含めないアクションを追加したい場合はcollectionを使用します。

resources :users do
  collection do
    get 'search'
  end
end

以下と同義のパスが追加されます。

get 'users/search', to: 'users#search'

resourcesのネスト

resourcesはdoでネストできます。

resources :users do
  resources :mails
end

URLは以下のようになります。

/users/:user_id/mails

ただネストを深くするのは推奨されないみたいです。3層くらいでやめておいた方がよいそうです。

スコープ

/v2/api/users のようにパスの前にv2やapiを置きたい場合はscopeを使います。

scope :v2 do
  scope :api do
    get 'users', to: 'users#index'
  end
end

以下のように namespace と書いても大体結果同じです。

namespace :v2 do
  namespace :api do
    get 'users', to: 'users#index'
  end
end

厳密にはPrefixがscopeの場合は ‘users’ 、namespaceの場合は 'v2_api_users’と違いがあるのでscopeは全体を囲う時、namespaceは特定の機能をグループ化したい時みたいな使い分けだと思います。

##リダイレクト
以下でリダイレクト可能です。

get '/', to: redirect('users/', status: 302)

root

以下のようにするとルート("/")にヒットします。

root to: 'application#notfound', via: :all

via: はメソッドです。GETとPOSTにヒットさせたい場合は via: [:get, :post]のように指定します。全てのメソッドにヒットさせる場合は :all を指定します。

どのパスにもヒットしない。’*path’

どのパスにもヒットしなかった場合の処理を書きたい場合は routes.rb の一番最後に以下のように記述します。

match '*path', to: 'application#not_found', via: :all

'*path’は全てにヒットします。直前までに記載されたルーティング全てにヒットしない場合は上記で application_controllerの not_foundアクションが呼ばれます。
via: :all で全てのメソッドが対象になっています。


とりあえずWebAPIを作る場合のルーティングで使うのはこんなところでしょうか。

コメント

このブログの人気の投稿

(真)ESP32の開発環境をVSCodeで作る

ESP32にmicroSD接続

ESP32でデバッグ