Drkcore

22 01 2007 catalyst Tweet

Controllerでやるべきかテンプレートに送るべきかわからんたいだ

User:Bookmarkみたいな1対多(多対多でもいいけど)なテーブルをDBICでいじるとする。

DBICをスクリプトなんかでいじくるときには、Perl/DBIC - Nekokak's core dump な感じでいいんだけど、、、、

CatalystでDBIC+TTを使う場合に、どこまでコントローラーで処理すればいいのか分からなくて悩んでる。

http://localhost:3000/bookmark/kzfm

みたいに、ユーザーのブックマークを表示したいときに

sub test1 : Private {
    my ($self, $c, $user) = @_;
    my $uid = $c->model('PblDB::User')
            ->find({empnum => $user})->id;
    my $b =
        [$c->model('PblDB::UserBookmark')->search(user_id => $uid)];
    my @bookmarks = map $_->bookmark_id, @$b;
    $c->stash->{bookmarks} = 
       [$c->model('PblDB::Bookmark')->search(id => \@bookmarks)];
    $c->stash->{template} = 'bookmarks/list.tt2';
}

これはイマイチというか駄目やろ(何のためにDBICのリレーション設定したのかわからんようになる) というのは分かるんだけど、下のやり方もなんか変。

sub test2 : Local {
    my ($self, $c, $user) = @_;
    $c->stash->{user} = $c->model('PblDB::User')
      ->find({empnum => $user});
    $c->stash->{template} = 'bookmarks/test.tt2';
}

で、テンプレートのほうは、user受け取ってbookmarkを取り出すと。

[% FOREACH bookmark = user.bookmarks -%]
<ul>
  <li>[% bookmark.id %]</li>
  <li>[% bookmark.title %]</li>
</ul>
[% END -%]

とかやると、処理がコントローラーとテンプレートにまたがっちゃうし、ページの処理とか面倒になっちゃう。

DBICのオブジェクトは渡さずに、コントローラー内で全部処理してハッシュをTTに被せるだけにするのがいいのかなぁ。

ウーム悩ましい(僕だけ?)

07.01.18 追記

コメント見て、なるほどと思ったのでこうしてみた。そのうちイテレータにする。

    defined($user)                                            ? #
    $c->stash->{bookmarks} = [$c->model('PblDB::User')       #
                             ->find($user->id)->bookmarks]   : # user exist
    $c->response->redirect('/bookmark/')                       ; # or not

ユーザーがいない場合には、インデックスにリダイレクトするようにした。

07.01.22 追記

モデルでやるべし。というコメントを見て、ふむー、ResultSetってそのためにあんのかとか思った。開放された気分。DBIC好きになってきた。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021