2017-08-02 119 views
0

我有一個表單繼承機制和一個基於文本類型創建對象的控制器方法。當使用Object.const_get()創建對象時,rails不會調用before_create new

從我的控制器:

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

你的代碼不是創建記錄,而是隻初始化它,因此你的'before_create'回調函數沒有執行。使用'.create(...)'而不是'.new()'或使用'after_initialize'回調 – MrYoshiji

+0

對不起,我省略了那部分,我正在調用.save – denodster

+0

嘗試在'set_handle'或'upload '看看是否引發了這個錯誤。這樣你就可以確定這些回調是否被觸發。 – MrYoshiji

回答

0

我已經改變了這直接調用基類的:

Tile.new(params_from_tile(tile_data)) 

現在預期我的鉤子被調用,所以我不知道爲什麼這樣的行爲這種方式,並希望得到一個更好的答案來自知道的人,但看起來答案是使用Object.const_get()。new創建一個對象跳過所有鉤子。在附註中,僅使用type屬性在基類上調用create仍然會導致子類掛鉤觸發,所以這很好。

+0

這很奇怪。 const是一個const。無論你如何得到它,都無關緊要。如果你可以準備一個演示問題的示例rails應用程序,我會告訴你爲什麼會發生這種情況:) –

0

從理論上講,沒有什麼區別,你如何訪問類,這兩個會表現得完全一樣:

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"),看看會發生什麼。

相關問題