2010/03/05

Mojoliciousのメモ

Mojoliciousをちょっと使ってて覚えたことをメモ。

まずリダイレクトではまった

Apache(mod_proxy)+Mojolicious(daemon_prefork)の構成


ProxyRequests Off
ProxyVia On
ProxyPass /hoge/ http://localhost:3000/
ProxyPassReverse /hoge/ http://localhost:3000/

上記のように設定して、http://example.com/hoge/をhttp://example.com/hoge/fuga/xxxxxにredirectしようとredirect_toを使ったら、http://example.com/fuga/xxxxxにredirectされた。

原因はMojoliciousのredirect_toが吐き出すLocation headerが相対URLだったため、ProxyPassReverseでドメインが書き換えられなかったことだった。

解決策としてMojolicious::Controllerを継承したクラスにredirect_to_absを実装した。


package MyApp::Controller;

use strict;
use warnings;
use base 'Mojolicious::Controller';

sub redirect_to_abs {
my $self = shift;
my $url = $self->url_for(@_);
return $self->redirect_to( $url->to_abs->to_string);
}
1;


次にpathのcaptureで時間を食ったのでメモ

pathをcontroller側でパラメータとして受けとる場合は下記のようにしないといけない。

my $r = $self->routes;
$r->route('/hoge/:id')->to('example#hoge', id => undef);

"id => undef"がポイント。デフォルト値を与えない場合は明示的にundefを渡してやらないと、controller側で値を取得できない。

controller側では下記のようになる。

package MyApp::Example;

use strict;
use warnings;
use base 'Mojolicious::Controller';

sub hoge {
my $self = shift;
my $id = $self->param('id');
}
1;

Catalystみたいに$cに続いてキャプチャできるのかと思ってたら、全然違ってハマった。

0 件のコメント:

コメントを投稿