Ruby on rails 使用object.const\u get()创建对象时,不调用创建前的rails。新建

Ruby on rails 使用object.const\u get()创建对象时,不调用创建前的rails。新建,ruby-on-rails,single-table-inheritance,Ruby On Rails,Single Table Inheritance,我有一个单表继承机制和一个基于文本类型创建对象的控制器方法 从我的控制器: tile = Object.const_get(tile_data[:type]).new(params_from_tile(tile_data)) tile.save 在我的模型基类中,在创建挂钩之前,我有几个挂钩: before_create :set_handle, :upload 看来我的钩子都没有开火,这与我使用Object.const_创建我的对象有关吗 编辑:我通过不使用Object.const_ge

我有一个单表继承机制和一个基于文本类型创建对象的控制器方法

从我的控制器:

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

tile.save
在我的模型基类中,在创建挂钩之前,我有几个挂钩:

before_create :set_handle, :upload
看来我的钩子都没有开火,这与我使用Object.const_创建我的对象有关吗


编辑:我通过不使用Object.const_get.new解决了这个问题,现在我只是直接调用我的Tile.new,而且似乎没有任何负面影响,所以是的。

我将此更改为直接调用基类:

Tile.new(params_from_tile(tile_data))

现在我的钩子按预期被调用,所以我不知道为什么会这样,我希望知道的人能给出更好的答案,但答案似乎是使用Object.const_get.new创建对象会跳过所有钩子。另一方面,仅使用type属性调用基类上的create仍然会导致子类钩子触发,因此这很好。

理论上,访问类的方式没有区别,这两种方式的行为完全相同:

Tile.new(params_from_tile(tile_data))

你的不良行为可能与其他一些小事情有关


可能是tile_data[:type]在您的示例中指向其他内容,您是否确保在不回调的情况下保存tile记录。您可以尝试使用Object.const\u getTile,看看会发生什么。

您的代码不是在创建记录,而是在初始化它,因此不会执行创建前回调。使用。创建。。。我没有使用.new或use after\u initialize callbackSorry,而是省略了该部分,我正在调用.saveTry在set\u handle或upload中引发错误,并查看是否引发了该错误。这样你就可以确定这些回调是否被触发。我想我已经回答了我自己的问题,没有使用Object.const_get.new修复了这个问题。这很奇怪。常数就是常数。不管你怎么得到它。如果您可以准备一个示例rails应用程序来演示这个问题,我会告诉您为什么会发生这种情况:
Object.const_get("Tile").new(params_from_tile(tile_data))