ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

Railsのroutes入門

友達に誘われてRailsデビューしました。

Railsの知識以前にRubyの知識が根本的に欠けてるんですけど、とりあえず他の言語、FWで得た知識使って、こんな感じかなーって設計してたんですけど

これどうやって実装するん(゜゜)

当然の壁にぶち当たりましたw
ルーティングについてちょっとわかったことを書きます

説明すること、しないこと

Railsのルーティングの設定はconifg/routes.rbに設定するそうです。routes.rbにはいくつか定義の方法があるんですけど、とりあえず今回

  • 1つずつ設定する
  • resources
  • resource

の3つについて説明します。他にもroutesに設定できるnamespaceとかあるけど長くなるのと、いまいちわかってないから今回は書かない

ルーティング設定

1つずつ設定する

getやpostを設定する方法です。ちゃんと触ったことないんですけど、1つずつ定義する方法はsinatraの書き方に似てる気がする

http_method 'url', to: 'controller#method'

構文はこんな感じ。で、実装例

Rails.application.routes.draw do
  # getの定義。idパラメーター付ける
  get '/users/:id', to: 'users#index'

  # postの定義
  post '/users/', to: 'users#create'
end

rake routesで確認

yuzu% bundle exec rake routes
Prefix Verb URI Pattern          Controller#Action
       GET  /users/:id(.:format) users#index
 users POST /users(.:format)     users#create

けっこうわかりやすくて簡単だなって印象を受けました。でもこれページというかリソースが増えるたびに定義が増えるから、可読性とか保守性とかあったもんじゃないと思った。

resources

resourcesを使うとCRUDを用意してくれる

Rails.application.routes.draw do
  resources :users
end

rake routesで確認

yuzu% bundle exec rake routes
   Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

urlには複数の中から、変更するデータを一意に識別するために:idが入ってる

resource

CRUDを用意してくれるのはresourcesと同じ。見たらわかると思いますが、複数形じゃないところが重要で、主に単体のデータに対して使用する。

Rails.application.routes.draw do
  resource :users
end

rake routesで確認

yuzu% bundle exec rake routes
    Prefix Verb   URI Pattern           Controller#Action
     users POST   /users(.:format)      users#create
 new_users GET    /users/new(.:format)  users#new
edit_users GET    /users/edit(.:format) users#edit
           GET    /users(.:format)      users#show
           PATCH  /users(.:format)      users#update
           PUT    /users(.:format)      users#update
           DELETE /users(.:format)      users#destroy

resourcesと違って、urlなどに一意に識別する:idがありません。「ログインしてたらセッションとかに一意に特定するためのデータあるからいらないよね?」ってことだと思う

設定例

実際に設定してみる。仕様としてはユーザ情報の詳細(show)はみんな見れるけど、それ以外は自分のアカウントに対してしかアクセスできない。

要するにindexshowだけresourcesで定義して、createとかはresourceで定義したい

こんな時はonlyexcept使う

  • only: 指定したアクション(indexとかshowとか)のみ作成する
  • except: 指定したアクションのみ作成しない
Rails.application.routes.draw do
  # resourceで定義されるshowはいらないので無視させる
  resource :users, except: [:show]
end

これでとりあえずこんな感じのルーティングが定義される

yuzu% bundle exec rake routes
    Prefix Verb   URI Pattern           Controller#Action
     users POST   /users(.:format)      users#create
 new_users GET    /users/new(.:format)  users#new
edit_users GET    /users/edit(.:format) users#edit
           PATCH  /users(.:format)      users#update
           PUT    /users(.:format)      users#update
           DELETE /users(.:format)      users#destroy

あとはindexshowが欲しい

Rails.application.routes.draw do
  # resourceで定義されるshowはいらないので無視させる
  resource :users, except: [:show]

  # indexとshowだけ作る
  resources :users, only: [:index, :show]
end

rake routesで、できてるの確認

yuzu% bundle exec rake routes
    Prefix Verb   URI Pattern           Controller#Action
     users POST   /users(.:format)      users#create
 new_users GET    /users/new(.:format)  users#new
edit_users GET    /users/edit(.:format) users#edit
           PATCH  /users(.:format)      users#update
           PUT    /users(.:format)      users#update
           DELETE /users(.:format)      users#destroy
           GET    /users(.:format)      users#index
      user GET    /users/:id(.:format)  users#show

ちゃんとindexshowだけ増えてますね(・∀・)

まとめ

基本的には1つずつ設定するのではなく、resource, resourcesonly, exceptを使って設定する。こうすることでルーティングの記述量減るし、見やすい

もしかしたらもっと良い指定方法あるのかもしれないけど、今の知識ではこの設定方法が一番良いと思う

まだほとんど読めてないけど、パーフェクトRuby on Railsをちょっとずつ読んでる。説明わかりやすいし、学ぶこと多いのが楽しいヽ(`▽´)/

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

早くrailに乗って、サービスを素早く作れるようになりたい

参考

ayaketan.hatenablog.com

qiita.com