大場寧子のホームページ - コントローラのRESTfulインターフェースをカスタマイズする Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

! コントローラのRESTfulインターフェースをカスタマイズする

「[[コントローラをRESTfulにする]]」では、map.resources を使った単純な RESTFul インターフェースの指定方法を説明しましたが、実際には、アクションの構造がそのような典型的な形でないこともあるでしょう。ここでは、map.resources のオプションを使って、任意のアクションをRESTFulにする方法をご紹介します。

なお、「[[親子構造のあるモデルを扱うコントローラをRESTfulにする]]」、「[[モジュール下のコントローラをRESTfulにする]]」もそれぞれ参考にしてください。

!! 典型的でないアクションに対するルートを用意する

map.resources で自動的に作られるルート以外に、独自のアクションに対して RESTful なURLを対応させたい場合は、3つのオプションを使います。どのような性質のアクションであるかによって使うべきオプションが異なります。

* :collection - 複数要素に対する処理について使います。
* :member - 単一要素に対する処理について使います。
* :new - 新しい要素に対する処理について使います。

各オプションの値はいずれも、HTTPメソッド(:get/:post/:put/:delete または :any)とコントローラメソッド名のハッシュにします。

例えば、未読メッセージ一覧を見る MessagesController の unread アクションがあるのであれば、このアクションでは複数のメッセージを表示しますので、:collection を使ってルートを追加します。表示系の処理ですので、HTTPメソッドは :get が適しているでしょう。

map.resources :messages, :collection => {:unread => :get}

さらに、1つのメッセージに対して返信を書き始める reply アクションと、1つのメッセージに重要マークをつける mark アクションを追加すると、次のようになります。

map.resources :messages, :collection => {:unread => get}, :member => {:reply => :get, :mark => :put}

!! コントローラ名と異なるリソース名をつける - :contorller

コントローラ名と異なるURLにしたいときは、リソース名をURLにあわせ、コントローラ名をオプションで指定します。例えば、/images/... で処理させたいコントローラが ImageFilesControllerなのであれば、次のように指定します。

map.resources :images, :controller => 'ImageFiles'

!! 単一要素に対するURLで別の表現を使う - :singular

厳密にいうと、単一要素に対するURLは、/users/1 よりも、/user/1 の方が正しいということがあります。リソース名は複数要素を表す名前、つまり複数形をつけることになっていますが、単一要素用のURLで表現を変えたいときは、:singular オプションで指定できます。

map.resources :user, :singular => 'user'

このようにすると、index アクションは /users、show アクションは /user/3 といった具合に、URLを変化させることができます。

!! URLの前につけるパターンを指定する - :path_prefix

resources で定義したいルートのURLの前に任意のパターンをつけることができます。例えば、ブログ記事の一覧 articles の前に、誰のブログかを表す :user_name をつけるには、次のように記述します。

map.resources :articles, :path_prefix => ':user_name'

!! URLヘルパーメソッド名のプリフィックスを指定する - :name_prefix

自動で用意されるURLヘルパーメソッド名では不都合なときに、自分でprefixを指定することができます。prefix は、_ で終わるようにするか、または nil を指定するこでprefixなしとします。