友達に誘われて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に乗って、サービスを素早く作れるようになりたい