0

私はクラスを持っており、実装したいいくつかの偽の関係があります:

module FormStack
   class Connection
      def forms; end
      def fields; end   
   end 
end

フォームとフィールドの両方に対してメタプログラムで生成されたクラス(RESTfulリソースであるため、同じアクション名とパラメーターを共有します)があり、これらのメソッドをFormStack::Connectionクラスの偽の関係に含めたいと思います。これはできますか?

私は本質的<FromStack::Connection Instance>.formsにそれがそうであるかのように振る舞いたいので、またはFormStack::Formのようなことをすることができます。<connection>.forms.all<connection>.forms.find(id)

これは可能ですか?おそらく注目すべきベストプラクティスはありますか?(これは私には少し奇妙に思えますが、残りのリソース/オブジェクトのActiveRecord風の抽象化を維持しながら、メソッドを便利な方法で実装するためのエレガントな方法だと思います)。

確認したい場合は、これが私が使用しているコードです:https ://github.com/TinderBox/formstack/tree/connection_instances

4

2 に答える 2

0

単純な構図を使ってみませんか?has_many新しいFormStack::Connectionインスタンスを初期化するときに、FormStack::Form関係を持つオブジェクトを渡します。次に、FormStack :: Formコレクションインスタンスで#formsメソッドを直接呼び出すか、委任を使用できます。

FormStack::Connection.new(FormStack::FormCollection.new(params[:form]) #sample class name -- obviously use whatever has the real has_many :forms

module FormStack
  class Connection
    def initialize(form_collection)
      @form_collection = form_collection
    end
    def forms
      @form_collection.forms
    end
    def fields
      @form_collection.fields
    end   
  end 
end

または

module FormStack
  class Connection
    extend Forwardable
    def_delegators :@form_collection, :forms, :fields

    def initialize(form_collection)
      @form_collection = form_collection
    end
  end 
end
于 2013-01-31T13:58:29.810 に答える
0

より良い方法がない限り、これは私が今のところ私の問題を解決した方法です:

def method_missing(meth, *args, &block)
    method_name = meth.to_s

    if "forms" == method_name
        FormStack::Form.connection = self
        FormStack::Form
    elsif ...
    else
        super
    end
end

https://github.com/TinderBox/formstack/blob/082793bed97e97cc65c703c8ca3cb382cbdf743a/lib/formstack/connection.rb

于 2013-01-31T21:36:08.963 に答える