ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

Ruby on Rails 3 アプリケーションプログラミング(7/9)

目次

ルーティング

現在のルート定義を確認する

$ rake routes
      ajax_index GET    /ajax/index(.:format)                  ajax#index
    fun_comments GET    /fun_comments(.:format)                fun_comments#index
                 POST   /fun_comments(.:format)                fun_comments#create
 new_fun_comment GET    /fun_comments/new(.:format)            fun_comments#new
edit_fun_comment GET    /fun_comments/:id/edit(.:format)       fun_comments#edit
...

RESTful なインターフェース

HTTPメソッドでCRUDを表現
リソースを…

  • 取得する GET (Read)
  • 作成する POST (Create)
  • 更新する PUT (Update)
  • 削除する DELETE (Delete)
  • config/routes.rb に記述
resources :リソース名 複数形 一覧表示、登録、更新、削除等CRUD
resource :リソース名 単数形 Config情報などシステム唯一のデータ管理に
  • ルートパラメータの制約条件
    • :constraints => {:パラメータ名 => 正規表現パターン }

ex)

resources :books, :constraints => {:id => /[0-9]{1,2}/}
  • 制約クラスの定義

ex) app/models/TimeConstraint.rb 9時から18時までルーティングを有効化、業務アプリに使えそう!

class TimeConstraint
  def matches?(request)
    current = Time.now
    current.hour >= 9 && current.hour < 18
  end

上記をconfig/routes.rb に組み込み

require 'TimeConstraint'

Railbook::Application.routes.draw do
...
  resources :books, :constraints => TimeConstraint.new
...
  • コントローラクラス/URLヘルパの名前を修正
    • 内部的に別名で処理
resources :users, :controller => 'members'

usersコントローラにアクセスしていると見せかけて、内部ではmembersコントローラにマッピング。

resources :users, :as => 'members'

上記に加え(?)URLヘルパも対応。users_path や user_path は members_path、member_path にマッピング。

  • モジュール配下のコントローラをマッピング

たとえば Administrator 専用のコントローラを作った場合↓

rails g controller Admin::Books

Admin::BooksController が app/controllers/admin/books_controller.rb に作成される。
上記クラスにアクセスするには以下のようにルーティングすれば良い。

...
  namespace 'admin' do
    resources :books
  end
...
$ rake routes
...
     admin_books GET    /admin/books(.:format)                 admin/books#index
                 POST   /admin/books(.:format)                 admin/books#create
  new_admin_book GET    /admin/books/new(.:format)             admin/books#new
 edit_admin_book GET    /admin/books/:id/edit(.:format)        admin/books#edit
      admin_book GET    /admin/books/:id(.:format)             admin/books#show
                 PUT    /admin/books/:id(.:format)             admin/books#update
                 DELETE /admin/books/:id(.:format)             admin/books#destroy


モジュールとして認識させるだけの場合は scope ブロックを使う。

...
   scope :module => 'admin' do
     resources :books
   end
...
$ rake routes | grep admin
                 GET    /books(.:format)                       admin/books#index
                 POST   /books(.:format)                       admin/books#create
                 GET    /books/new(.:format)                   admin/books#new
                 GET    /books/:id/edit(.:format)              admin/books#edit
                 GET    /books/:id(.:format)                   admin/books#show
                 PUT    /books/:id(.:format)                   admin/books#update
                 DELETE /books/:id(.:format)                   admin/books#destroy
  • 指定したアクションを無効にする
    • :except => ['アクション名']
  • 指定したアクションのみを有効にする
    • :only => ['アクション名']
  • 階層構造を持ったリソースの表現
    • 書籍1に対するレビューを 〜books/1/reviews のように表現
  resources :books do
    resources :reviews
  end
$ rake routes | grep reviews
         reviews GET    /reviews(.:format)                         reviews#index
                 POST   /reviews(.:format)                         reviews#create
      new_review GET    /reviews/new(.:format)                     reviews#new
     edit_review GET    /reviews/:id/edit(.:format)                reviews#edit
          review GET    /reviews/:id(.:format)                     reviews#show
                 PUT    /reviews/:id(.:format)                     reviews#update
                 DELETE /reviews/:id(.:format)                     reviews#destroy
    book_reviews GET    /books/:book_id/reviews(.:format)          reviews#index
                 POST   /books/:book_id/reviews(.:format)          reviews#create
 new_book_review GET    /books/:book_id/reviews/new(.:format)      reviews#new
edit_book_review GET    /books/:book_id/reviews/:id/edit(.:format) reviews#edit
     book_review GET    /books/:book_id/reviews/:id(.:format)      reviews#show
                 PUT    /books/:book_id/reviews/:id(.:format)      reviews#update
                 DELETE /books/:book_id/reviews/:id(.:format)      reviews#destroy

非RESTfulなルート定義

  • 基本
    • match ':controller(/:action(/:id(.:format)))'
    • match '/:locale' => 'books#index'
  • ルートへのマッピング
    • root :to => 'books#index'
      • index.htmlがあるとそっちが優先されるらしい

ルートの優先順位について

ファーストヒットで決まる。
match ':controller(/:action(/:id(.:format)))' のような汎用な指定は routes.rb の末尾で定義すること。