私がここで起こっていると仮定しているのは、アプリには文字通り同じことをするコントローラーがたくさんあるので、継承を利用してそれを乾かしたいということです。
そうは言っても、ApplicationController がこの機能のすべてをダンプするのに適切な場所であるかどうかは完全にはわかりません。将来、新しいコントローラーがあれば、それらは必ずしも必要とせずにこの機能をすべて継承することになるからです。
私はこのようなことをします:
- 次のようなコントローラーがあるとします。
- lions_controller.rb
- tigers_controller.rb
- hippos_controller.rb
そして、それらはほとんど同様の機能を備えています...「ベース」コントローラーを作成してから、子コントローラーで継承をセットアップします。次に、子コントローラーの「論理的な」デフォルトを設定するアクションも作成します。このようなものです。
動物コントローラー.rb
class AnimalsController < ApplicationController
class_attribute :resource_class, :parent_resource_class
protected
def self.set_resource_attributes(options={})
self.resource_class = options[:resource_class]
self.parent_resource_class = options[:parent_resource_class]
end
end
LionsController.rb
class LionsController < AnimalsController
#call methods in AnimalsController here, start with setting the resource name
set_resource_attributes :resource_class => Lion, :parent_resource_class => Animal
end
などなど...他に役立つ可能性があるのは、メソッド「instance_variable_set」を使用して、実際に意味のあるビューでインスタンス変数名を設定できるようにすることです...これを行うために設定したクラス変数...たとえば、AnimalsController.rb クラスを再度開きます。
class AnimalsController < ApplicationController
def show
instance_variable_set("@#{self.resource_class.name.underscore}".to_sym, self.resource_class.find(params[:id]))
#... all the regular show stuff
end
end
このようにして、lions#show パスに移動すると、ビューに表示@lion
されるのは、設定され、ActiveRecord で見つかった Lion クラスのインスタンスを含むという名前の変数へのアクセスです。
もちろん、ここに挿入したこの疑似コードは、クリーンアップしてもう少し DRY することができますが、うまくいけば、私の意図するところにたどり着くことができます。うまくいけば、これが役に立ちます。