似非REST対応としてHTML::Shakanに特定パラメーターを無視させる

| コメント(0) | トラックバック(1)

HTML5でform要素のmethod属性に(これまでのgetpostに加えて)putdeleteが追加されることを心待ちにしていますが、勧告に先立つ実装が出たからといって、古いUAを切り捨てるわけにはいきません。

ということでHTTPメソッドとしてはpostなんだけれども_methodという名前の値でputだとかdeleteだとかを主張する、Railsでもおなじみの似非REST(なんだかエベレストみたいな語感ですね)として、現在のアプリケーションを開発しています。

ここで問題になるのはフォームの取り扱いです。編集画面(入力画面)とそのフォームの送信先のURIが同じ場合、_methodという値がいることで$c->req->paramsが存在すると思われてしまいます。HTML::Shakanの場合、$form->submitted_and_validを多用することになりますが、_methodだけが定義されている場合には$form->submittedだと見なさないような手当が必要になります。

ということで、HTML::Shakanを継承したモジュールで、_build_submittedメソッドをオーバーライドしてしまいます。

MyApp::HTML::Shakanの例

package Amikeco::HTML::Shakan;
use Any::Moose;
our $VERSION = '0.02';

use List::MoreUtils qw(uniq);

use Amikeco::HTML::Shakan::Renderer::HTML::DefinitionList;

extends qw(
    HTML::Shakan
);

has 'ignore_params' => (
    is          => 'rw',
    isa         => 'ArrayRef',
    auto_deref  => 1,
    lazy        => 1,
    builder     => '_build_ignore_params',
);

sub _build_ignore_params {
    return [qw(
        _method
    )];
}

override '_build_submitted' => sub {
    my ($self, ) = @_;

    my $r = $self->request;
    my %ignore_param;
    @ignore_param{ $self->ignore_params } = ();
    my $submitted_field = (
        scalar
          grep { defined $r->param($_) && ! exists $ignore_param{$_} }
          uniq
          map  { $_->name }
                 $self->fields
    );
    return $submitted_field > 0 ? 1 : 0;
};

override '_build_renderer' => sub {
    Amikeco::HTML::Shakan::Renderer::HTML::DefinitionList->new();
};

no Any::Moose;
__PACKAGE__->meta->make_immutable;
__END__

ご覧のように、ignore_paramsに合致する値は、リクエストとして見なさないという手当てです。おまけとして、レンダラーのデフォルトオブジェクトを指定する_build_rendererも、先の記事で使った定義リスト(<dl>)による表示を実現するオブジェクトを使っています。

トラックバック(1)

例えばRESTfulなディスパッチテーブルとして、以下のようなものがあるとします... 続きを読む

コメントする

筆者"Gardejo"について

  • Twitter: @gardejo
  • GitHub: gardejo
  • CodeRepos: gardejo
  • CPAN: MORIYA

このサイトについて

Eorzea System Worksは、架空のシステム開発結社です。

FF14.name (FinalFantasyXIV.name)では、アヴァター(プレイヤーキャラクター)の管理システムやイベント出欠・リマインダシステムや、リンクシェル(LS)運営・管理システムやDKPシステムなどを設計・開発・公開する予定です。

関連サイト

関連サイトでは、他にもFF14に関連するサイトをいくつか紹介しています。

リンク, トラックバック歓迎

このブログへのリンク(どのページでも構いません)やトラックバックを歓迎します。

設計・開発・運用の参考にさせていただきますので、コメントもお気軽にお寄せください!

個別の記事に対するご意見などのほか、目安箱もご用意しています。

このブログ記事について

このページは、Gardejoが2009年7月18日 04:11に書いたブログ記事です。

ひとつ前のブログ記事は「HTML::Shakan::Widgets::Simpleの修正(1) ラジオボタンの関連付け」です。

次のブログ記事は「Arkでの似非REST実装方法」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

2014年2月

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  

やや真面目なサイト