Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ダムで学ぶRailsのRoutes入門

 ダムで学ぶRailsのRoutes入門

publichtml

July 15, 2016
Tweet

More Decks by publichtml

Other Decks in Programming

Transcript

  1. No. 10 RailsのRouterの役割 URL Router Controller Action dams/:id login/ dams/

    dams#index dams_path sessions#new new_session_path dams#show dam_path id = 13 • URLと Controller Action の紐付け • pathの命名
  2. No. 14 Railsのアーキテクチャスタイル REST  Web上の情報を以下で表現 • リソース(名詞) – URL •

    リソースに対する操作(動詞) – HTTPメソッド • GET, POST, (PUT), PATCH, DELETE • PUTよりPATCHが推奨 • 豆知識: ブラウザが対応していないメソッド は”_method”パラメータでメソッド名を送る
  3. No. 17 ダムCRUD一式基本セット 用途 HTTP メソッド パス(URL) コントローラ #アクション ダム一覧

    GET dams/ dams#index ダムの新規登録 フォーム GET dams/new dams#new ダムの新規登録 POST dams/ dams#create ダムの詳細 GET dams/:id dams#show ダムの編集 フォーム GET dams/:id/edit dams#edit ダムの更新 PATCH/ PUT dams/:id dams#update ダムの削除 DELETE dams/:id dams#destroy scafold(CRUDコードジェネレータ)で生成されるもの
  4. No. 18 Routesの基本の書き方 # conf i g/routes.rb Rails.application.routes.draw do get

    'dams/:id/edit', to: 'dams#edit', as: :edit_dam … HTTPメソッド パス(URL) “:”付きはパラメータ コントローラ#アクション route名 自動付与されたもので いい場合は省略可
  5. No. 19 ダムCRUD一式のRoutes表現 get 'dams', to: 'dams#index', as: :dams post

    'dams', to: 'dams#create' get 'dams/new', to: 'dams#new', as: :new_dam get 'dams/:id/edit', to: 'dams#edit', as: :edit_dam get 'dams/:id', to: 'dams#show', as: :dam match 'dams/:id', to: 'dams#update', via: [:patch, :put] delete 'dams/:id', to: 'dams#destroy'
  6. No. 20 リソースならではのSyntax Sugar get 'dams', to: 'dams#index', as: :dams

    post 'dams', to: 'dams#create' get 'dams/new', to: 'dams#new', as: :new_dam get 'dams/:id/edit', to: 'dams#edit', as: :edit_dam get 'dams/:id', to: 'dams#show', as: :dam match 'dams/:id', to: 'dams#update', via: [:patch, :put] delete 'dams/:id', to: 'dams#destroy' resources :dams コントローラ名 (=リソース名の  複数形) リソースの存在を明示的に示せる
  7. No. 21 一部のアクションしか使わない場合 # 一覧, 詳細表示のみが可能なリソース resources :dams, only: [:index,

    :show] # 削除できないリソース resources :dams, except: destroy • resourcesのonly, exceptオプションで取捨選択 • リソースをreadableに明示しつつ、過不足ない routesを定義
  8. No. 22 サブリソース (1/2) • リソースに従属するサブリソース • モデル上で has_* のassociationで表される

    もの – 例: ダム has_many 放流設備(ゲート、バルブ) クレストゲート オリフィスゲート
  9. No. 23 サブリソース (2/2) • サブリソースはresourcesのネストで表現 resources :dams do #

    ダム has_many 放流設備 resources :discharge_facilities end • パスは前半に親の指定子が含まれる /dams/:dam_id/discharge_faciliteies/:id サブリソース自身の指定子 親リソースの指定子
  10. No. 25 単数形のリソース (2/2) • 単数形のresouceで表現する resources :dams do #

    ダム has-one ダム湖(貯水池) resource :reservoir end • パスには自身のidを含まない 単数形: /dams/:dam_id/reservoir/edit 複数形: /dams/:dam_id/reservoirs/:id/edit コントローラ名 (=リソース名の  単数形)
  11. No. 27 リソースへの追加Routes • resource(s)のブロック内に書ける resources :dams do get :xxx,

    to: 'dams#xxx' # => /dams/:dams_id/xxx # RESTfulなアクションの追加 get :export, to: 'dams#export', on: :collection # => /dams/:export (コレクションへの操作) get :map, to: 'dams#map', on: :member # => /dams/:id/map (個別リソースへの操作) end
  12. No. 29 リソースに基づかないRouting • リソースと考えるのにそぐわないケース もある • 例: トップページ •

    無理せずにトップレベルに書く get 'controll_center/', to: 'controll_center#index'
  13. No. 32 namespace (1/2) • URLとControllerにnamespaceをつけられる namespace :admin do resources

    :dams end • パス: /admin/dams/... • コントローラ: admin/dams#... • namespace無しの dams#... とは別クラス、 別ディレクトリ
  14. No. 33 namespace (2/2) • よくある使い方: ユーザ画面と管理画面の分離 • 管理画面にnamespaceを付与 •

    管理画面用コントローラのみに高度な変更操作を実装 # ユーザ側ではダム情報の閲覧しかできない resources :dams, only: [:index, :show] # admin/ 配下の管理画面では、全操作が可能 namespace :admin do resources :dams end
  15. No. 34 scope (1/2) • パスにprefxをつけられる scope 'xxx' do resources

    :dams end • パス: /xxx/dams/... • コントローラ: dams#...
  16. No. 35 scope (2/2) • prefxにはパラメータも含められる • 例: damsコントローラですべての一覧と水系別の一覧 を提供したい

    # 以下のresourcesは両方 dams コントローラ resources :dams # => # /dams/... scope 'river_system/:river_system_id' do resources :dams # => river_system/:river_system_id/dams/... end
  17. No. 36 match • 複数のHTTPメソッドをサポートする match 'dams/:id', to: 'dams#update', via:

    [:patch, :put] match ':controller(/:action(/:id))(.:format)', via: :all • 究極形 ただし、本当に複数サポートが必要なのかは見直した方がよい どんなURLが存在するのかroutesでは全くわからなくなる → 使っちゃダメ、ゼッタイ!!
  18. No. 37 いろいろなオプション • concern • サブRoutesの共通化 – 例: 画像添付できるリソース用の共通サブリソースを定義

    • constraints • URLやリクエストに様々な制約を加える – パラメータ(:id等)のフォーマット、サブドメイン、IP、 アクセス方法(Ajax or not)… • その他いろいろ
  19. No. 39 まとめ • RailsのRoutes設計はURLから • URL設計はリソースから • リソースが決まるとController, Controller

    Action, Modelも導き出される • 時にはリソースからの脱線も必要 • Routesにはたくさんの便利なオプションが あります • ダムの前を通りかかったら、ぜひ立ち寄って あげてください