Cat 5.80003 で C:C:Resources 0.04 のテストがコケる
なんか、修正してコミットしようかとか思ったんだけど、色々調べてどうしたらいいのかわからんくなったので、気が付いたことをメモっておきます。
以下の三つをなおすと期待した挙動はします。unattached_action の対処方法で controller に直接書く以外の方法がわかればテストも通るとおもう。
$class->_action_cache
Catalyst::Controller::Resource の setup_actions 内で $class->_action_cache が使われてるけど、Catalyst::AttrContainer がもう使われてないっぽい。(クラス自体はある)
$class->_action_cache のところをコメントアウトすると動く
sub setup_actions { my ($self, $map_to, $maps) = @_; my $class = ref $self || $self; # my @action_cache = @{ $class->_action_cache }; while (my ($action, $map) = each %$maps) { next unless my $code = $class->can($action); $map = { method => uc $map } unless ref($map) eq 'HASH'; my @attrs = $self->_construct_action_attributes($map_to, $map); unshift @attrs => @{ attributes::get($code) || [] }; # # rewrite cache # if (my $cache = first { $code eq $_->[0] } @action_cache) { # $cache->[1] = [@attrs]; # } # else { # push @action_cache => [ $code => [@attrs] ]; # } # $class->_attr_cache->{$code} = [@attrs]; attributes->import($class, $code, @attrs); } # # set action_cache # $class->_action_cache(\@action_cache); }
Catalyst::DispatchType::Chained#list の unattached_actions に引っかかる
Catalyst::DispatchType::Chained の Line 113 あたり。5.7 までは chain 元があるかないかとか見てなかったんだけど、追加されたっぽい。
そもそも C:C:Resource の setup_resources で collection と member を追加するようになってるんだけど、DispatchType::Chained の list の方が先に評価されてるとかそういう感じ?
CATALYST_DEBUG=1 で prove 走らせると以下のように出力されます。
[debug] Unattached Chained actions: .-------------------------------------+--------------------------------------. | Private | Missing parent | +-------------------------------------+--------------------------------------+ | /account/create | /account/collection | | /account/destroy | /account/member | ...
ちなみに MyApp::Controller::* に sub collection {} と sub member {} を直接書くと回避できる。hmm...
belongs_to した時の挙動が変わってしまう
MyApp::Controller::Users::Articles を M:C::Users に blongs_to させておくと例えば各記事の期待する path は /users/1/articles/1 となるんだけど、実際には /users/1/users/articles/1 になる。5.7 系だと期待通り。
この patch あてると 5.8 でも期待通りのどうさになります。これだけコミットしようかとも考えたんだけど、テストが通らないままというのもなんなので。さーせん >_<
*** lib/Catalyst/Controller/Resource.pm.org 2009-05-10 16:53:44.000000000 +0900 --- lib/Catalyst/Controller/Resource.pm 2009-05-10 16:55:05.000000000 +0900 *************** *** 73,79 **** sub _parse_PathPrefix_attr { my ($self, $c, $name, $value) = @_; ! return PathPart => $self->path_prefix; } sub new { --- 73,79 ---- sub _parse_PathPrefix_attr { my ($self, $c, $name, $value) = @_; ! return PathPart => $self->{path} || $self->path_prefix; } sub new {
「何言ってんだ、こいつ」と思ったら捕まえてくださいw > id:ikasam_a