2017-05-08 79 views
0

好的,偶然發現了這個奇怪現象。我在我的用戶模型中有這個。在兩個活動記錄回調中更新記錄

after_create :assign_role, :subscribe_to_basic_plan 

    def assign_role 
    self.role = 1 
    self.save 
    end 

    def subscribe_to_basic_plan 
    self.customer_id = "hello" 
    self.save 
    end 

(代碼被簡化爲了演示)

當我創建我的用戶,並檢查它在控制檯中我得到role: 1, customer_id: nil。但!!,如果我從第一個回調中刪除保存,一切正常。

after_create :assign_role, :subscribe_to_basic_plan 

    def assign_role 
    self.role = 1 
    end 

    def subscribe_to_basic_plan 
    self.customer_id = "hello" 
    self.save 
    end 

產生role: 1, customer_id: "hello"。所以似乎它只讀取回調中的第一個.save。我想了解什麼是確切的行爲和原因。我花了很多時間試圖查明這一點,不想再次遇到類似的事情。

編輯:

也許這是有幫助的。當我使用self.save!在subscribe_to_basic_plan我收到一個錯誤,並且記錄根本沒有保存。將self.save!放在assign_role中不會改變任何內容,所以問題肯定是第二個.save

+0

你有什麼模型驗證? – Rose

+0

我正在用':validatable'選項使用設計。除此之外沒有什麼所以基本的電子郵件和密碼驗證 – redFur

回答

1

這個答案是理論上的,因爲我需要看完整的模型代碼才能確定。

很可能您在assign_role中的第一次保存由於某種原因失敗。當它失敗並返回下降時,導致導軌跳過所有回調。然後你的第二個回調永遠不會運行。在我的優先順序

可能的解決方案:

  • 不要使用回調。讓您的控制器在保存模型之前設置這些值。
  • 使用before_create,所以你沒有在同一行中完全保存3個完全相同的模型。
  • 將您的兩個回調合併到一個回調中,只保存一次。
  • 使用save(validate:false)保存以防萬一驗證失敗。
+0

該問題似乎沒有在第一次保存,它成功罰款,並且使用'save!'時不會拋出錯誤。我認爲你是對的,因爲有些事情正在進行驗證。用'before_create'替換並刪除所有保存工作,並可能是正確的方法。由於這個問題更具理論性,並且詢問爲什麼會發生這種情況,我現在就把它打開。 – redFur