routes.rb をもう一度考えてみた #shibuyarb

30
routes.rb もう一度考えてみた @tkawa 2012.7.18 Shibuya.rb

Upload: toru-kawamura

Post on 15-May-2015

5.936 views

Category:

Technology


1 download

DESCRIPTION

補足 http://d.hatena.ne.jp/tkawa/20120720/p1

TRANSCRIPT

Page 1: routes.rb をもう一度考えてみた #shibuyarb

routes.rb をもう一度考えてみた

@tkawa

2012.7.18 Shibuya.rb

Page 2: routes.rb をもう一度考えてみた #shibuyarb

@tkawa川村 徹

RESTとかRailsとか書いてるブログ

http://d.hatena.ne.jp/tkawa/

Web認知行動療法U2plus http://u2plus.jp/

Page 3: routes.rb をもう一度考えてみた #shibuyarb

routes.rb書いてますか?

resources使ってますか?

Page 4: routes.rb をもう一度考えてみた #shibuyarb

Hoge::Application.routes.draw do  resources :usersend

Page 5: routes.rb をもう一度考えてみた #shibuyarb

@kenn

Is it only me who think rails routes.rb is a mess?

@miyagawa

config/routes.rb goddamnit

https://twitter.com/kenn/status/184076612504006656

https://twitter.com/miyagawa/statuses/221405166853828608

@jugyo

routes.rb 開くたびに憂鬱になる

https://twitter.com/jugyo/status/14690985107

Page 6: routes.rb をもう一度考えてみた #shibuyarb

routes.rb sucks?

Page 7: routes.rb をもう一度考えてみた #shibuyarb

routes.rb の悪いところを考えてみた

Page 8: routes.rb をもう一度考えてみた #shibuyarb

I.resources が直感的でない

Page 9: routes.rb をもう一度考えてみた #shibuyarb

基本7アクションindex

show

new

edit

create

update

destroy

Page 10: routes.rb をもう一度考えてみた #shibuyarb

$ rake routes users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#newedit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy

resources :users

Page 11: routes.rb をもう一度考えてみた #shibuyarb

GET POST PUT DELETE

/users index create - -

/users/:id show - update destroy

GET /users/new → newGET /users/:id/edit → edit

resources :users

Page 12: routes.rb をもう一度考えてみた #shibuyarb

II.Convention over

Configuration じゃない

Page 13: routes.rb をもう一度考えてみた #shibuyarb

7アクションが「規約」なら resources も書かなくてもいい

のでは?

Page 14: routes.rb をもう一度考えてみた #shibuyarb

Conventional Routes

https://github.com/tkawa/conventional_routes

Page 16: routes.rb をもう一度考えてみた #shibuyarb

namespace :admin do   namespace :special do     resources :licenses   end   resources :users end resources :users

app/controllers/admin/special/licenses_controller.rbapp/controllers/admin/users_controller.rbapp/controllers/users_controller.rb

Conventional Routes

Page 17: routes.rb をもう一度考えてみた #shibuyarb

Conventional Routes

• routes.rb に何も書かなくても、コントローラが存在すれば、自動的に

resources とみなす

• ディレクトリは namespace

• もしコントローラの中まで見れば、Sinatra的なこともできそう

Page 18: routes.rb をもう一度考えてみた #shibuyarb

Sinatra的なことをもうやってる人がいた!(しかも2年前)

Page 19: routes.rb をもう一度考えてみた #shibuyarb
Page 20: routes.rb をもう一度考えてみた #shibuyarb

Routes are unnecessary configuration.

The seven standard controller actions are legacy.

Become intimate with your URLs – don’t abstract them away.

Decrease the distance between thought and implementation.

Let the controller do its job.

http://peepcode.com/blog/2010/rethinking-rails-3-routes

Page 21: routes.rb をもう一度考えてみた #shibuyarb

# Class method and HTTP-style methods.class ReportsController < ApplicationController  before_filter :authenticate  resource "/reports(/:id)"

  get(:collection) do  end

  get(:member) do |id|  end

  put(:member) do |id|  end

end

His idea

Page 22: routes.rb をもう一度考えてみた #shibuyarb

Astaire

https://github.com/pehrlich/astaire

Page 23: routes.rb をもう一度考えてみた #shibuyarb

# Class method and HTTP-style methods.class ReportsController < ApplicationController  before_filter :authenticate

  get "/reports" do  end

  get "/reports/:id" do  end

  put "/reports/:id" do  end

end

Astaire (like Sinatra)

Page 24: routes.rb をもう一度考えてみた #shibuyarb

2年も経ってるのに反応薄いし、やっぱりいまいち?

Page 25: routes.rb をもう一度考えてみた #shibuyarb

• Viewの命名規約が別途必要{view}.html.erb どういう名前にする?

• resources のパターンを活かせない

GET POST PUT DELETE

/reports index create - -

/reports/:id show - update destroy

Sinatra式の問題点

Page 26: routes.rb をもう一度考えてみた #shibuyarb

いろいろ考えたけど• 今の routes.rb はそれなりにベター

• 基本7アクションを残すなら、match (get, post, put, delete) はむしろ書かなくてすむようにしたい

• とにかく resources (resource) にすることで、

routes.rb はシンプルになる。REST的にもOK

Page 27: routes.rb をもう一度考えてみた #shibuyarb

resources :messages, except: [ :new ] do post :trash, :restore, on: :member resources :image_attachments, only: :index end

https://github.com/rails/routing_concerns

Page 28: routes.rb をもう一度考えてみた #shibuyarb

resources :messages, except: [ :new ] do post :trash, :restore, on: :member resources :image_attachments, only: :index end

resources :messages, except: [ :new ] do member do put :trashed delete :trashed end resources :image_attachments, only: :index end

Page 29: routes.rb をもう一度考えてみた #shibuyarb

resources :messages, except: [ :new ] do member do put :trashed delete :trashed end resources :image_attachments, only: :index end

resources :messages, except: [ :new ] do resource :trashed, only: [:create, :destroy] resources :image_attachments, only: :index end

# “partial” option does not exist in fact resources :messages, except: [ :new ], partial: [:trashed] do resources :image_attachments, only: :index end

※ちょっと意味が変わる

Page 30: routes.rb をもう一度考えてみた #shibuyarb

RailsにおけるRESTfulなURL設計勉強会

Sendagaya.rb #12

7/23 (月) 19:00-

http://www.zusaar.com/event/324057