2017-08-02 2 views
0

私は単一のテーブル継承メカニズムと、テキスト型に基づいてオブジェクトを作成するコントローラメソッドを持っています。私のコントローラからObject.const_get()でオブジェクトを作成するときにbefore_createが呼び出されないnew

:私のモデルベースクラスの内部

tile = Object.const_get(tile_data[:type]).new(params_from_tile(tile_data)) 

tile.save 

I持っているいくつかの前に作成フック:

before_create :set_handle, :upload 

それはそれはとは何かを持っていない、私のフックのどれもが発射されていない表示されます私のオブジェクトを作成するObject.const_getの私の使用?

編集:私はObject.const_get()を使用しないでこれを回避することができました。新しい今私は自分のTile.newを直接呼び出すだけで、ネガティブな反響はないようです。

+0

あなたのコードはレコードを作成するのではなく*初期化する*ため、あなたの 'before_create'コールバックは実行されません。 '.new()'の代わりに '.create(...)'を使う '' after_initialize''コールバックを使う – MrYoshiji

+0

残念ながら、私はその部分を省いて、.saveを呼び出しています – denodster

+0

'set_handle'または' upload 'そのエラーが発生しているかどうかを確認してください。こうすることで、これらのコールバックがトリガーされたかどうかを確認できます。 – MrYoshiji

答えて

0

私は直接基底クラスを呼び出すために、これを変更しました:

Tile.new(params_from_tile(tile_data)) 

をそして今、予想通り、私のフックが呼び出されているので、これはこのように動作し、なぜ私はわからないんだけど、より良い答えをいただければ幸いです知っている誰かから、それは答えは、Object.const_get()を使用していることが表示されます。オブジェクトを作成するための新しいすべてのフックをスキップします。副作用では、タイプ属性だけでベースクラスに対してcreateを呼び出すと、サブクラスのフックが起動するので、niceです。

+0

それは変です。 constはconstです。あなたがそれをどのように取得するかは関係ありません。あなたが問題を示すレールアプリの例を準備できたら、なぜそれが起こるか教えてください:) –

0

理論的には、あなたがクラスにアクセスする方法に違いは、これらの両方がまったく同じ挙動する、ありません。

Tile.new(params_from_tile(tile_data)) 

Object.const_get("Tile").new(params_from_tile(tile_data)) 

あなたの見て悪い行動が他のとしなければならないことがあり小さなものがない。

あなたの例では何かを指しているかもしれませんが、Tileのレコードがcallbackなしで保存されることを確認しましたか? Object.const_get("Tile")で試してみて、何が起こるか見てみましょう。

関連する問題