ルーティングにアクションを追加

リソースベースのルーティングの場合、自動で7つのアクションを呼び出すためのルーティングが設定されますが、7つのアクションだけしか利用できないわけではなく他のアクションを追加することも可能です。ここではアクションを追加する方法について解説します。

(Last modified: )

アクションの追加

リソースベースのルーティングでは「index」「show」「new」「edit」「create」「update」「destroy」の7つのアクションへのルーティング自動で設定されます。これに別のアクションを呼び出すためのルーティングを追加することもできます。「config/routes.rb」ファイルにサンプルが記載されています。

Sample2::Application.routes.draw do

  # Sample resource route with options:
  #   resources :products do
  #     member do
  #       get 'short'
  #       post 'toggle'
  #     end
  #
  #     collection do
  #       get 'sold'
  #     end
  #   end

end

書式は次のとおりです。

resources :リソース名 do
  member do
    HTTPメソッド名 'アクション名'
  end

  collection do
    HTTPメソッド名 'アクション名'
  end
end

追加するアクションを member ブロック又は collection ブロック内に記述します。この2つのブロックの違いは member ブロックの方は特定のデータを対象としたアクションを記述し、collection ブロックには全てのデータを対象としたアクションを記述します。member ブロックの方に記述したアクションに対してはリクエストでIDパラメータを指定する必要があります。

では今回ルーティングの設定として「config/routes.rb」ファイルをテキストエディタで開き、次のように記述しました。

Sample2::Application.routes.draw do

  resources :blogs do
    member do
      get 'preview'
      post 'reset'
    end

    collection do
      get 'search'
    end
  end

end

そして「rake routes」を実行して設定されたルーティングを確認してみます。

p6-1

上の3つが追加されたルーティングで次のようになっています。

GET    'blogs/:id/preview' => 'books#preview'
POST   'blogs/:id/reset'   => 'books#reset'
GET    'blogs/search'      => 'books#search'
GET    'blogs'     => 'books#index'
POST   'blogs'     => 'books#create'
GET    'blogs/new' => 'books#new'
GET    'blogs/:id/edit' => 'books#edit'
GET    'blogs/:id' => 'books#show'
PUT    'blogs/:id' => 'books#destroy'
DELETE 'blogs/:id' => 'books#update'

member ブロックに記述した「preview」と「reset」はリクエストのURLの中で「id」パラメータが必要となっているのが分かります。

別の記述方法

アクションを追加する場合、先程の書式とは別に次のように記述することもできます。

resources :リソース名 do
  HTTPメソッド名 'アクション名', :on => :member
  HTTPメソッド名 'アクション名', :on => :collection
end

例えば先程と同じアクションを追加する場合は次のように記述します。

Sample2::Application.routes.draw do

  resources :blogs do
    get 'preview', :on => :member
    post 'reset', :on => :member

    get 'search', :on => :collection
  end

end

どちらの記述方法でも同じです。

動作確認

それでは実際に試してみます。「sample2」アプリケーションに「blogs」コントローラが作成されていたので、いったん削除します。

p6-2

その後で改めて「blogs」コントローラを作成し、さらに「index」「preview」「search」アクションをを作成します。

p6-3

ルーティングの設定として「config/routes.rb」ファイルをテキストエディタで開き、次のように記述しました。

Sample2::Application.routes.draw do

  resources :blogs do
    member do
      get 'preview'
      post 'reset'
    end

    collection do
      get 'search'
    end
  end

end

それでは準備ができましたのでRailsアプリケーションを起動して下さい。そしてまずブラウザから「http://localhost:3000/blogs」へアクセスして下さい。すると次のように「index」アクションが呼び出されます。

p6-4

では追加したアクションを呼び出してみます。「http://localhost:3000/blogs/search」へアクセスして下さい。すると次のように「search」アクションが呼び出されます。

p6-5

続いて「http://localhost:3000/blogs/1/preview」へアクセスして下さい。すると次のように「preview」アクションが呼び出されます。

p6-6

このようにパラメータを必要とするアクションや必要としないアクションに対するルーティングをリソースベースのルーティングに追加することができました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。