2016-01-24 82 views
1

我需要從模型生成xml並將其發送到模型保存的Web服務。 我相信這是一個常見的情況,應該是直截了當的。只需在after_save回調中創建一個作業,該作業生成xml並將其發送到端點。在模型保存上生成併發送xml保存

由於我是Ruby on Rails的新手,我不確定如何處理這個問題。我的問題更多的是關於代碼組織。這個api連接在未來不會停止,所以我需要一個乾淨的模塊化方式來擺脫它。將它放在單獨的寶石中是否是最佳實踐/慣例?寶石能否將作業添加到現有的軌道隊列中?寶石可以在安裝時創建遷移嗎?我可能需要添加一個模型來跟蹤api同步。如何刪除一個表卸載寶石?或者我應該不使用寶石?

我意識到這是廣泛的和基本的Ruby on Rails的問題,但我的文檔類溺水。我只是希望得到一些例子和/或建議,也許還有一些指向相關文檔的指針。謝謝。

回答

1

寶石安裝/卸載量無關的應用程序,他們生活在不同程度上,不KHOW關於你的應用程序代碼的任何東西,DB等,除非它們被加載。

寶石鋼軌可以提供rake任務和/或發電機,例如你可以看看devise寶石結構上它是如何做到這一點。

但是,我建議不要在你知道必須將代碼移到gem之前,例如當你需要在不同的項目中重用它時。

要重新使用單項目中的代碼 - 使用混入/關注

1

一般:

  1. 不讓它寶石
    • 這是痛苦的不必要的世界裏,幾乎總是,
    • 絕不會讓任何東西成爲寶石,除非您打算在3+應用程序中以相同方式使用它
  2. 沒有提取到一個問題或者,
    • 似乎並不很可能你會做多模型相同的操作,代碼重用似乎不是在這裏是一個問題,你實際上可以重用代碼更有效地利用服務類太
    • 了很多有經驗的程序員的Rails認爲這practiceconcerning,原諒這個雙關語。看來這種觀點並不是由Rails開發團隊共享的,但至少從我的經驗來看,編寫服務類似乎是不必要的複雜性,直到你的項目增長足夠多,然後你需要重構一大堆東西,並且你意識到自己會變得更好從一開始就拋棄顧慮
    • 使用服務類,而不是從模型委託必要的方法將其
    • 這將留下一個乾淨的界面後提取,也將讓你,如果你需要使用依賴注入模擬您的XML服務進行測試
  3. 不會將API請求綁定到模型回調,通常只有2-3個地方需要您執行某些操作個API和其他案件一堆那裏可能並非如此,試想:
    • 測試,
    • 或者如果你的要求,以實現緩存列,
    • 或「訪問次數」列
    • 或類似的認爲它想的東西添加到模型,但改變了主意,而不是說只是觸及updated_at
    • 或任何這樣的欺騙,這將讓你成爲一個宏偉的API垃圾郵件發送者和患者的回形針寶石VERRRRY數據庫更新緩慢
  4. 如果你做配合API請求模型回調,
    • ,那麼你最好確保錯誤處理得當和超時等不回滾或延緩你的數據庫操作,
    • 最好的方法,從我的經驗是通過ActiveJob + one of the backends運行這些東西(雖然顯然不是:inline後端和最好不使用你的主數據庫,並允許異步作業提交的後臺之一 - sidekiq想到爲候選人)