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

ダムで学ぶRailsのRoutes入門

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 ダムで学ぶRailsのRoutes入門

Avatar for publichtml

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にはたくさんの便利なオプションが あります • ダムの前を通りかかったら、ぜひ立ち寄って あげてください