Catalystのデータの更新って

Catalyst+CDBIでinsertはcreateメソッド呼び出すから、更新はupdateメソッドだろって勘違いしててデータ更新だけがうまくうごかないプログラムができてしまい、

キャッシュか?キャッシュなのか?もしや。

なんつって、しばらく悩んだ。

で、Shibuya Perl Mongersの Wiki作りの資料見ててやっとぼけてたことに気づく。

sub save : Global { my ( $self, $c ) = @_; my $title = $c->req->params->{'title'}; my $contents = $c->req->params->{'contents'}; unless(my $wiki = MyWiki::M::CDBI::Wiki->retrieve(title => $title)){ MyWiki::M::CDBI::Wiki->create({title => $title, contents => $contents}); }else{ $wiki->contents($contents); } $c->res->redirect($c->config->{base} . '?' . $title); }

O/Rマッピングで、オブジェクトとして扱ってんだから更新はセットすればいいだけじゃん。

いま思うと、そりゃそうだろうって感じだが。CDBIちゃんと理解しておかないといけなさげだな。

Catalystのテストサーバをいちいち再起動しなくていいことを知る

Catalystでものづくりな日々が続いてますが、モジュールとかのファイルを更新するたびに、Catalystのテストサーバ再起動すんの

キャッタリーーース

と、面倒くさがっていたら、

-r オプションつけて起動しとけば、自動的に再起動されるということを知った。

Lost-Season: CatalystのTestServerが自動再起動の機能を実装

catalyst.pl Demo で、プロジェクト作成 cd Demo script/demo_server.pl -r

というように、-r オプションを付けると自動再起動モードになります。 一秒ごとにチェックして、編集されたファイルがあると テストサーバが再起動されます。

ナイス、Catalyst。 素敵デス。

$req->paramと$req->params

Catalyst初心者二人組(片方はPerlすら初心者)が謎のエラーに遭遇して、無事に生還したぞの巻だ。

最近mysqlを使ったウェブアプリケーションを構築していて、僕はその面倒を見ているわけだ。普通のCRUDな感じのアプリなんで、いつも通りに書けばたいして難しい話ではないが、(僕が)どうしてもフレームワークを使ってみたかったので、O/Rマッピング最高だろ!な!わかるだろ、SQLなんて書かなくていいんだぞ!なんつって、手動かしてもらってる。

で、はまった箇所はGETでパラメータを渡してmysqlにinsertするとこで、Catalyst::Model::CDBI::DB->create するとこんなエラーを吐いて終了したぞ(何故?)。

Caught exception in Test->add "Can't use string ("5") as a subroutine ref while "strict refs"

最初原因がわからなくて小一時間悩んだが、

  • $req->paramはパラメータ
  • $c->req->param('kzfm')
  • $req->paramsはパラメータのリファレンス
  • $c->req->params->{kzfm}

ので、$c->req->param->('kzfm')と書いてた部分がエラーの原因だった。

Q.じゃぁ5って何よ? A.パラメータにわたった変数の数です

Catalystはなかなか新鮮だ。

「Catalyst」の初級者向けサンプルをトレースする

チョコチョコとCatalystの勉強もしていますヨ。なんつっても面白いからネ!

taskpad.jp みたいなのを Catalyst で作ってみるというのをやってみたが、ポスグレ派の僕はポスグレでやろうとしてはまるの巻だ。

そもそも、Catalyst::Plugin::Authenticationだとperl -MCPANではいるので、それを使おうとしたあたりからおかしくなりはじめ。 Catalyst::Plugin::Authentication::CDBIを使った認証の通りにやったがうまくいかず。ポスグレだとうまくいかなさげなのでデータベースをMySQLに変更して再度チャレンジしたがうーん。結局 Catalyst で Authenticationに倣ってOK

そろそろMySQLに移ってもいいかななんて思う今日この頃。EnsemblもMySQLだしな。

それと、javaから入った人にMVCっていまいち身にならんとかいうと、

エーなんでやねん、めっちゃMVCやろ

ぐらいの言われようだったりするんだが、モデル(M)はいい、DBだし。ビュー(V)もまぁいい、見せ方だけだし

でも、コントローラーってなんやねんMV以外のをまとめてコントローラーって呼んでるだけじゃないんか?なんて思ってしまう僕はまだまだなのか?

CatalystでPostgreSQL使うの挫折

現在、Catalystでいろいろと遊んでいます。

が、どうもポスグレはCDBIはうまくいくんだけどCatalystのプラグインからだと、エラー吐いてしまう。

Couldn't instantiate component "MyTask::M::CDBI", "Can't call method "classes" on an undefined value at /usr/lib/perl5/site_perl/5.8.3/Catalyst/Model/CDBI.pm line 68." at /usr/lib/perl5/site_perl/5.8.3/Module/Pluggable/Fast.pm line 86

試行錯誤した結果、軽く挫折した。Class::DBI自体最近使い始めて便利さを実感し始めている状況なんで、コードを追っかけても、いまいちわからんし、深追い注意っぽかったので、さっくりあきらめた(本当はポスグレ使いたかったけどな)。試しに、mysqlで同じことやってみたら拍子抜けするほどうまくいったんで、6.5.xからずっと付き合ってきたポスグレだけど、mysqlに乗り換えようかなぁと思った。あと、mysql使っているサンプル多いし。

さらに、SQL以外のコマンド覚えんのメンドイよなぁとか思って敬遠してたmysqlだけど、今日いじったら、インストールもラクチンだし、コマンドも分かりやすいし、単に喰わず嫌いなだけだったのかもと思ってしまったのも、ポスグレに固執する必要ないんじゃないかと思った理由のひとつ。

でも、ここで調子に乗って最新版(5系)入れるとはまりそうなので今夜はFC1のデフォルトの3系で我慢した。明日あたり、職場のテストサーバーで十分に5系のテストして、うまく動いてるのを確認してから、家のマシンもバージョン上げようかなあと。

あとこのサイトの資料がmod_perl周りの設定がわかりやすく書いてあって参考になった。

まだ書きなぐりコードばっかりなのでmod_perlで運用しているアプリはないけど、頑張ってなんか作ってmod_perlで動かしたる。

Catalyst使ってみた

ってことで早速Catalystをさわってみましたヨ。

まずは手始めに、Class::DBIを必要としないElementary, ... use Catalyst qw(初挑戦);のサンプルをなぞってみた。

一つ一つ解釈しながら手動かすとなるほどなるほどよくわかります。

sub default : Private { my ($self, $c) = @_; $c->res->output('Hello World! &l;ta href="page2/">go to page.'); }

でここの部分でHTMLを解釈しなかったので?と思ったが、多分Content-Typeだろうなと思って、それを追加したらうまく表示された。

sub default : Private { my ($self, $c) = @_; $c->res->content_type("text/html; charset=UTF-8");  $c->res->output('Hello World! <a href="page2/">go to page.'); }

ちょっと触れただけだけど、かなり面白い!なんといってもテスト用のサーバーがスクリプトから起動すると、すごく便利だ。