ありがたい。色々勉強になりました。
Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら
基本コントローラーでRSを作りまくってstashにぶち込みまくって Viewの方で実際にクエリを実行する感じですね。
というわけでcookbookみながら悩んでみた。いじってるのは、こんな感じのテーブルなので、
user_bookmarksテーブルに対してイテレータをまわすことにした。 あとcatlystだとautoっていう最初(のほうに)に呼ばれるメソッドがあるので、そこにユーザーが存在するかどうかのバリデーション書いた。
sub auto : Private { my ($self, $c, $action, $username) = @_; $c->stash->{user} = $c->model('PblDB::User')->single({name => $username}); unless (defined($c->stash->{user}) || $c->req->path =~ m!^bookmarks/?$!) { $c->response->redirect($c->uri_for('/')); return 0; } return 1; } sub default : Private { my ( $self, $c ) = @_; $c->stash->{user_bookmark_it} = $c->model('PblDB::UserBookmark')->search( {user_id => $c->stash->{user}->id}, { prefetch => [qw/user bookmark/], join => [qw/user bookmark/], order_by => 'me.id DESC' } ); }
あと、ユーザーバリデーションしてる件に関しては、
livedoor クリップ - Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら
個人的には、バリデーションでユーザがいるかどうかはチェックしないなー。 そこでユーザの存在がわかっちゃうとあれかなと。まぁ、場合によるね。
とか
ってやった場合に、ユーザがいない場合にそんなメソッドがないよってエラーになっちゃうので、バリデーションしたというのが経緯なのだが、join使えば、
sub default : Private { my ( $self, $c, $action, $username ) = @_; $c->model('PblDB::UserBookmark')->search( {'user.name' => $username}, { prefetch => [qw/user bookmark/], join => [qw/user bookmark/], order_by => 'me.id DESC' } ); }
と書けばよいのでこれでもいいかもしれんと思った。
あと、実際のサービスでそういった場合の処理はどうしてんのかなと気になったので僕が使っているSBSで調べてみた。
- はてなブックマーク
- トップページに飛ばされる
- livedoor clip
- unregistration.html
- del.icio.us
- エラーページ
ふむー。