$c->form の名前がだめ
ごろうさんが CGI.pm の param の扱いがいけてねーとかいってて、オレは validator がほしいよ、とかいってたんだけど、よく考えたら普通に validator つかえるじゃんか。
なんかページング処理とかで $c->req->params->{page}
を自前でごにょっと処理してて嫌な感じだったんだけど
$c->form( page => [ ['GREATER_THAN', 1] ] );
とかしとけば $c->form->valid('page')
で綺麗な値がとれると。
多分、めちゃくちゃ常識だと思われますが、僕は form という名前にだまされたのかこういう用途につかうということをまったく思いつかなかった。
$c->validator
とかにすればいいのに!!
Catalyst の config
基本的なものは MyApp.pm
ないで
__PACKAGE__->config( ... );
で指定し、deploy 先で違うものなんかの設定を myapp.yml に書いて上書きとかってやろうとおもっても、現状の Catalyst.pm
では
$class->config( { %$oldconf, %$conf } );
ってなってるだけだから普通に深い階層になるのがデフォな Catalyst 設定ではいまいち使えないあるね。
たとえば myapp.yml に
session:
cookie_name: session
とか書くと、$c->{config}->{session}
のほかのキー消されちゃう><
こういう使いかたしてる人いねってことかしら?
cpanrecent_crawler を Schema::Loader にスイッチ
今朝かいた Catalyst の Model を Schema::Loader でロードってやつを、CPAN Recent Changes のクローラでやってみた。
今までは use MyApp;
方式でロードしていて、それからの変更は以下のような感じ。
こんな感じで割りとすぐ移行可能。Class::C3
の warning が消えたのがかなりうれしいなぁ。
こないだ書いた Catalyst の DBIC モデルを外部スクリプトから利用するっていうやつ、DBIx::Class::Schema::Loader つかえばいいね。
use FindBin;
use lib "$FindBin::Bin/../lib";
{
package MyApp::Model::DBIC;
use base qw/DBIx::Class::Schema::Loader/;
__PACKAGE__->load_from_connection(
dsn => 'dbi:...',
);
__PACKAGE__->load_classes;
}
こんな感じにすれば、MyApp::Model::DBIC::*
をロードしてくれる。
全部ロードしてもいいなら use MyApp;
で終わりなんだけど多分ほとんどの場合外部スクリプトから必要なのはモデル部分だけだと思われる。
Data::Clmemo
CLON の作成にあたり Data::Clmemo などというものができちゃったわけですが、激しくオレフォーマットな Changelog memo しかパースできないため、CLON の公開にはこれの拡張が必至。
フォーマットの定義を Data::Clmemo::* でやればいいのかね。DBIC::Loader とかのイメージで。
find_or_new
sub find_or_new { my $class = shift; my $attr = @_ > 1 ? {@} : $[0]; my $exists = $class->find($attr); return defined $exists ? $exists : $class->new($attr); }
find_or_create
はあるのにこれはないとか謎い。NOT NULL なカラムもってるテーブルだとあんまりつかえねーよ>find_or_create
updated daap_proxy.pl
うごいてなかった。違う環境でテストしてたよ。。
Uninitialized value in pattern match
例えば
push @plugins, 'Static::Simple' if $ENV{CATALYST_ENGINE} =~ /^HTTP/;
などとしたときに $ENV{CATALYST_ENGINE}
が未定義だとタイトルのように怒られるわけです。
$ENV{CATALYST_ENGINE} and $ENV{CATALYST_ENGINE} =~ /^HTTP/;
とか
$ENV{CATALYST_ENGINE} || '' =~ /^HTTP/;
とかするわけですがいまいち冗長!
これはどうするのが普通なのか。