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)はみんな見れるけど、それ以外は自分のアカウントに対してしかアクセスできない。
要するにindex
とshow
だけresources
で定義して、create
とかはresource
で定義したい
こんな時はonly
とexcept
使う
- 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
あとはindex
とshow
が欲しい
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
ちゃんとindex
とshow
だけ増えてますね(・∀・)
まとめ
基本的には1つずつ設定するのではなく、resource
, resources
にonly
, except
を使って設定する。こうすることでルーティングの記述量減るし、見やすい
もしかしたらもっと良い指定方法あるのかもしれないけど、今の知識ではこの設定方法が一番良いと思う
まだほとんど読めてないけど、パーフェクトRuby on Railsをちょっとずつ読んでる。説明わかりやすいし、学ぶこと多いのが楽しいヽ(`▽´)/
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/06
- メディア: 大型本
- この商品を含むブログ (8件) を見る
早くrailに乗って、サービスを素早く作れるようになりたい