読者です 読者をやめる 読者になる 読者になる

Catalystでアクションが受け付けるメソッドを制限

Railsだと,あるアクションはPOST以外は受付たくないってときには,

class NancharaController < ApplicationController
  verify :method => :post, 
         :only => [ :create, :delete ],
         :redirect_to => { :action => :index }
  
  def create
    # createの処理
  end

  # 略
end

という感じにverifyを使う.これだと,制限を一つの場所にかけてわかりやすい.一方,Catalystではぱっと見た感じverifyものが見つからなくて,

sub create : Local {
    my ($self, $c) = @_;
    
    if ($c->req->method ne 'POST') {
        $c->res->redirect($c->uri_for('/'));
        return;
    }
    
    # createの処理
}

という感じにアクション毎にPOSTを制限するコードを書いてる.なんかださいし,インデントが深くなっていかん.なんとか,Railsみたいにアクションの制限とかはコントローラで一括して書きたいところ.

Catalystだと,autoメソッドにしこんでおくのが普通なのかなぁ.だとすると,こんな感じ?

sub auto : Private {
    my ( $self, $c ) = @_;

    my @post_only_actions = qw(logout);

    if(    $c->req->method ne 'POST'
        && grep { $c->action->name eq $_ } @post_only_actions ) {
        $c->res->redirect($c->uri_for('/user'));
        return 0;
    }

    return 1;
}

うーん,なんかださい.みんなどうやってるんだろ.