1

私はこのようなものを持っています

class Reply < AR::Base
end

class VideoReply < Reply
  def hello
    p 'not ok'
  end
end

class PostReply < Reply
  def hello
    p 'ok'
  end
end

...

したがって、オブジェクトを作成しているとき:

# params[:reply][:type] = "VideoReply"
@reply = Reply.new(params[:reply])

子メソッド (この場合) を呼び出すにはどうすればよいVideoReply::helloですか?

UPD: 私は非常にばかげた解決策しか想像できません:

@reply = Reply.new(params[:reply])
eval(@reply.type).find(@reply.id).hello

しかし、それはクールではないと思います:)

4

1 に答える 1

2

STI ベースのモデルを扱っている場合、注意しないと作成に問題が発生します。基本クラスを使用して検索する限り、それらの取得は自動的に行われます。

必要なのは、最初に適切な種類のモデルを作成することであり、残りは問題ありません。モデルまたはコントローラーで、有効なクラスのリストを定義します。

REPLY_CLASSES = %w[ Reply VideoReply PostReply ]

次に、これを使用して、オブジェクトを作成する前に型を確認できます。

# Find the type in the list of valid classes, or default to the first
# entry if not found.
reply_class = REPLY_CLASSES[REPLY_CLASSES.index(params[:reply][:type]).to_i]

# Convert this string into a class and build a new record
@reply = reply_class.constantize.new(params[:reply])

これにより、適切なクラスで応答が作成されます。この時点で、メソッドは希望どおりに機能するはずです。

于 2010-08-20T16:53:32.780 に答える