Rails3 の routes.rb に独自定義を追加する

通常の CRUD 操作に必要なルーティングの定義は resources でまかなえますが、よくある確認画面を挟む時のルーティングについて説明します。新規作成時の確認画面を confirm_create に、更新確認画面を confirm_update にそれぞれネーミングします。また、モデルの名前は post とします。

まず通常の CRUD 操作を定義する

config/routes.rb を開いて、通常の resources を記述します。scaffold を使うとここは自動的に定義してくれるはずです。

resources :posts

新規作成確認のルーティングを追加する

新規作成の確認時には(通常の場合なら)まだデータは保存されていないため、特定の id には依存しません。なので、この場合のアドレスは /posts/confirm_create のようになります。これを表現するには、以下のように記述します。

resources :posts do
  collection do
    post :confirm_create
  end
end

上では POST でルーティングを作りましたが、他の方法も使えます。検索機能を GET で実装するなら以下のように追記します。

resources :posts do
  collection do
    post :confirm_create
    get :search
  end
end

また、複数のアクションを collection で定義しないのであれば、一行で記述する方が短く済みます。

resources :posts do
  post :confirm_create, :on => :collection
end

更新確認のルーティングを追加する

更新の場合、既存のデータに操作を行うのでアドレスは /posts/:id/confirm_update のようになります。この場合は member を使います。

resources :posts do
  collection do
    post :confirm_create
  end
  member do
    post :confirm_update
  end
end

その他

現在のルーティングをコマンドから確認する時は

bundle exec rake routes

で一覧表示できます。何かおかしいと思った時は確認してみると気がつく事もあるかもしれません。