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を作る場合のルーティングで使うのはこんなところでしょうか。
コメント
コメントを投稿