0

Controller の変数名の前に @ を付けることで、ロードされたビューで使用できるようになることを理解し、感謝しています。これは非常に便利ですが、その魔法を理解したいと思います。それはどのように起こり、止めることができますか?

継承を使用して CRUDdy リソース コントローラーを DRY しようとしています。ほとんどのロジックをApplicationController. スーパークラスは、抽象変数@resource(単一のリソースの場合)、@resources(リソースのコレクションの場合)、および@parent_resource(ネストされている場合の親リソースの場合) を参照する必要@resourceがありますが、理想的には、ビューはより具体的な名前を取得します。@customer@customers、および@sales_territoryそれぞれ。これは、すべてのオブジェクトの複製 (抽象名で 1 回、具象名で 1 回) をビューに送信せずに実行できますか?

私がこれを書いているとき、頭に浮かぶ可能性は次のとおりです。

  1. 保護されたインスタンス変数...Rubyにはそのようなものがありますか?もしそうなら、コントローラーの魔法はそれらをビューに渡しますか?
  2. レンダリング/リダイレクトの前に汎用の名前付き変数を nil に設定する
  3. サブクラスで定義された保護された空のメソッドを使用して、名前付きインスタンス変数を抽象化する代わりに

これを実装する方法の正しい選択は何ですか?

4

1 に答える 1

5

私がここで起こっていると仮定しているのは、アプリには文字通り同じことをするコントローラーがたくさんあるので、継承を利用してそれを乾かしたいということです。

そうは言っても、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 することができますが、うまくいけば、私の意図するところにたどり着くことができます。うまくいけば、これが役に立ちます。

于 2013-09-12T20:48:03.257 に答える