class AaaController < ApplicationController def load ... end def loading ... end end
実際に使う際は、こんな感じです。
class BbbController < AaaController def bbb ... end end
rails 2.3の時は、なんの問題もなかったのですが、
rails 3.0にしてみたらBbbControllerでloadアクションが見つからなくなってしまいました。
ためしに、BbbControllerを以下のように変更したら、ちゃんと動くので気持ち悪い状態です。
class BbbController < AaaController def load super end def bbb ... end end
rails c
で確認してみたところ、確かにloadメソッドはBbbControllerでも認識されているのに、actionとしては認識されていない状況でした。
irb(main):> c1 = AaaController.new irb(main):> c2 = BbbController.new irb(main):> c1.method(:load) => #<Method: AaaController#load> irb(main):> c2.method(:load) => #<Method: BbbController(AaaController)#load> irb(main):> c1.action_methods => #<Set: {"load","loading"}> irb(main):> c2.action_methods => #<Set: {"loading"}>
一度AaaControllerからloadアクションを削除してみて確認したところ、Railsのどっかでloadメソッドが定義されていたことがわかりました。
irb(main):> c2 = BbbController.new irb(main):> c2.method(:load) => #<Method: BbbController(ActiveSupport::Dependencies::Loadable)#load>
Railsのソースを見てみたところ、Controller内で定義されているものは、きちんとactionとして認識されるのですが、継承したmethodに関しては、すべてがactionと認識されるわけではなく、Railsのどっかで定義しているmethodに関してはactionにならないことがわかりました。
なのでloadが使えない対策は、loadの名称変更になりました。
共通のactionを使いたいということであれば、クラスを敬称させるのでなくてモジュールにしてincludeした方がよかったかなぁとか思ったりもしてみました。
0 件のコメント:
コメントを投稿