我有一个表继承机制和一个基于文本类型创建对象的控制器方法。
来自我的控制器:
tile = Object.const_get(tile_data[:type]).new(params_from_tile(tile_data))
tile.save
在我的模型基类中我在创建钩子之前有几个:
before_create :set_handle, :upload
看来我的钩子都没有射击,它是否与我使用Object.const_get创建我的对象有关?
编辑:我设法通过不使用Object.const_get()来解决这个问题。现在我刚刚直接调用我的Tile.new,似乎没有任何负面影响,所以是的。
答案 0 :(得分:1)
理论上,你访问这个类的方式没有区别,这两个行为完全相同:
Tile.new(params_from_tile(tile_data))
和
Object.const_get("Tile").new(params_from_tile(tile_data))
你看到的不良行为可能与其他一些遗漏的小事有关。
您的示例中可能tile_data[:type]
指向其他内容,是否确保Tile
记录在没有callback
的情况下保存。你可以试试Object.const_get("Tile")
,看看会发生什么。
答案 1 :(得分:0)
我已将此更改为直接调用基类:
Tile.new(params_from_tile(tile_data))
现在我的钩子被按预期调用了,所以我不确定为什么这样做会这样,并且会欣赏知道的人的更好答案,但似乎答案是使用Object.const_get ().new创建一个对象跳过所有钩子。在旁注中,仅使用type属性在基类上调用create仍然会导致子类挂钩触发,所以这很好。