1

Ruby で少しメタプログラミングをしています。特にコントローラーで、いくつかのメソッドをメタ定義するライブラリを作成しています(アプリケーション用に作成する必要があるいくつかの find_by メソッドを自動化します)。

現在、特定のコントローラーのモデルの名前をメタプログラミング メソッドに渡す必要があるため、これらのメソッドを生成しています。ActiveRecord モデルに関連付けられているコントローラーにメソッドはありますか。

だから、これは悪い例です

module AwesomeGem
  module ClassMethods
    def write_some_methods_for(model)
      raise "Class #{model.class} does not inherit ActiveRecord::Base" unless model < ActiveRecord::Base

      define_method "money_remaining" do |id=nil|
         moolah = id ? model.find(id).money : model.find(params[:id]).money
         render text: moolah
      end

      define_method "money_remaining_poller" do |id=nil|
         obj = id ? model.find(id) : model.find(params[:id])
         # composes some ajax
         render js: moneyjs
         moneyjs
      end
    end
  end
end

だから、この方法を使うために、私は

GamblerController < ApplicationController
  write_some_methods_for Gambler
end

繰り返しますが、Gambler クラスをメソッドに渡す必要がないようにするにはどうすればよいでしょうか? モデルを直接呼び出すことができる何らかのメソッドまたは属性はありますか? 例えば。self.send(:モデル)

複雑な説明付きの簡単な質問。

4

1 に答える 1

1

デフォルトでは、コントローラは特定のモデルに関連付けられていません。いくつかの異なるモデルで遊ぶコントローラーを持つことも、まったくモデルを使用しないコントローラーを持つこともできます。

「古典的な」ケースでコードを自動的に動作させたい場合は、コントローラーの名前を見て、同じ名前のモデルを探すことができます (レールの命名規則に従います)。

于 2013-03-18T15:00:54.933 に答える