日向夏特殊応援部隊

俺様向けメモ

Catalyst::Controller::Resources でオーバーロード POST を使いたい

id:ikasam_a にわがまま言ったら Catalyst::Request::REST::ForBrowsers ってのを教えて貰ったよ。

オーバーロード POST って何だよって方は、

とか読むと幸せになれると思います。

使い方

MyApp にて、こんな感じにしときます。

package MyApp;

use strict;
use warnings;

use Catalyst::Runtime '5.70';
use Catalyst::Request::REST::ForBrowsers;

### 中略

__PACKAGE__->request_class('Catalyst::Request::REST::ForBrowsers');

みたいな感じ。そうすると Catalyst::Request の代わりに Catalyst::Request::REST::ForBrowsers が使われるようになります。

んでもって、html 中で、

<form action="[% c.uri_for('/path/to') | html %]" method="post">
  <input type="hidden" name="x-tunneled-method" value="delete" />
  <input type="submit" name="submit" value="delete" />
</form>

みたいにやっとくと、Catalyst::Controller::Resources の destroy にうまく dispatch してくれます。

蛇足 - looks_like_browser

C::R::REST::ForBrowsers だけど、looks_like_browser メソッドも同時に提供してくれてて、これはブラウザの画面上から普通にリクエストした物なのか、XHR 経由 *1 なのかを判定してくれるみたいです。

*1:x-requested-with リクエストヘッダの値を見てる