簡體   English   中英

在適合任何地方的Rails應用程序中放置類的指南

[英]guidelines for where to put classes in Rails apps that don't fit anywhere

我想知道是否有任何關於在Rails應用程序中放置非標准Ruby文件的最佳實踐,哪些不適合任何默認目錄( controllers / models等)。

我說的是控制器/模型等使用的類,但不是任何Rails基類的子類。 包含從模型中提取的功能的類,以減少它們的負擔。 其中一些看起來像模型,但不是AR模型,其中一些看起來更像“服務”,有些是介於兩者之間或其他東西。

一些隨機的例子:

  • 通過facebook等處理密碼驗證的“策略”類。
  • 封裝params或“XCreator”對象的“XParams”對象處理params的處理以執行一些復雜的動作,最終導致創建一些AR模型
  • 向外部API發出請求或封裝這些請求和響應的類
  • 可替代真實AR模型的假模型(例如訪客用戶)
  • Resque工作
  • 存儲和讀取Redis信息的類
  • 執行某些特定操作的類,如處理數據,生成報告等,並從Resque作業或rake任務調用

我現在有很多這些,其中一些被添加到lib ,最終成為一堆隨機類和模塊,一些潛入app/models 我想以某種方式組織這個,但我不知道從哪里開始。

只有AR型號才能進入app/models嗎? 或者也可以放置任何域或幫助模型? 你如何決定某件事是模特?

如果不適合app所有內容都進入lib嗎? 或者我應該向app添加一些新的自定義子目錄? 什么子目錄,以及如何划分自定義類?

你如何在你的項目中處理這個? 我知道每個項目都有點不同,但必須有一些相似之處。

好問題 - 我沒有具體的答案

但我建議查看這篇文章 - http://blog.codeclimate.com/blog/2012/02/07/what-c​​ode-goes-in-the-lib-directory/ - 一定要仔細閱讀所有評論

在當前的項目中我在app / models下有很多非ActiveRecord對象,它工作但不理想我在lib下放了're-useable'非應用程序特定代碼

我在側面項目中嘗試過的其他替代方案(比如我們有一堆命令對象)rails在app下的命名空間是一種痛苦,它默認將所有內容加載到同一個命名空間中

app/
  commands/
    products/create_command.rb         # Products::CreateCommand
    products/update_price_command.rb   # Products::UpdatePriceCommand

alternate,除了src或app_name目錄下的rails之外的所有內容

app/
  src/
    commands/
      create_product.rb         # Commands::CreateProduct
      update_product_price.rb   # Commands::UpdateProductPrice

我沒有找到一個很好的解決方案,理想情況下,第二個更好,但很高興沒有在應用程序下的額外目錄,這樣你打開應用程序,看到控制器,命令,模型等...

您觸及了許多不同的用例,我認為這部分最接近“正確”的答案:

我現在有很多這些,其中一些被添加到lib,最終成為一堆隨機類和模塊,一些潛入app / models。 我想以某種方式組織這個,但我不知道從哪里開始。

這在我的書中非常正確。 你沒有提到的一件事是將各種碎片提取到不同的寶石中。 與外部服務相關的類是提取的最佳候選者,如果它們足夠通用,則是策略類。 這些可以是私有的,因為運行您自己的gem服務器並不難,然后您可以明顯地在ROR應用程序中重用它們。

最后也是最具體的一點,我將重建工作歸入lib / jobs。

我的經驗法則是,如果它是某種類型的模型,它進入app/models 如果不是,它可能屬於lib或其一些適當命名的子目錄,例如lib/jobslib/extensionslib/external等。

我在apps/models放置任何模型類(如STI子類)。 我將其他類放在lib ,因為它似乎是放置它們的最佳位置。 我很容易知道在哪里看。 由於我的模型類都在一個地方,因此我也更容易對測試進行分組。

按照慣例,我不喜歡在app/models輔助類。 如果他們是主持人類,他們屬於app/helpers 如果他們不是那么lib似乎是他們最好的地方。

如果你感興趣的話,我還寫了一篇關於這篇文章的后續文章,總結了我發現的內容: http//blog.lunarlogic.io/2013/declutter-lib-directory/

通常我的類在子目錄中找到lib的方式,其中與子目錄同名的模塊負責包含它們。 (對於自動加載器,Rails對文件名和類名非常敏感。)

另一種選擇是將每個模塊封裝到自己的gem中,然后通過Gemfile引用gem。 這允許跨項目共享代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM