2017-02-10 56 views
2

我是Ruby on Rails的新手。來自C#和Java背景的Ruby on Rails看起來很棒,但同時也很有趣。這幾乎就像是從一個基於類的面向對象的世界到JavaScript的原型概念,甚至是一個函數式語言。無論如何,在傳統的C#或Java MVC應用程序中,我傾向於儘可能保持模型和控制器的清潔,將業務邏輯提取到服務類中。我的模型只是POCOs/POJO(最多有一些計算字段和驗證)。我的控制器只處理傳入的請求(主要依賴依賴注入),然後返回一個視圖或JSON。MVC中的服務類的Ruby on Rails替換問題?

但是,我沒有看到任何清晰的RoR世界模式。有些人傾向於把他們所有的業務邏輯放到控制器中,有些人把它放到模型中(使用ActiveRecords,雖然我不喜歡它,但它有道理。

然後有關注的概念。他們是提取我的業務邏輯的合適地點,而不是使用服務?如果是的話,你能否包括正確的Concers使用的例子?我仍然在與模塊的概念鬥爭(他們是更多的命名空間,或者更確切地說是接口)?正如開頭所說,Ruby對我來說似乎是一個全新的星系。

回答

1

我會說jpgeek反應是答案的一部分。這是很多向服務對象的移動來清理胖模型或大型控制器的行爲。只需創建一個應用程序/服務的文件夾,並創建服務類,如:

class TargetDestructionService 

    def initialize(shooter, target) 
    @shooter = shooter 
    @target = target 
    end 


    def execute 
    #Lot of code that causes the destruction of the target. 
    end 
end 

然後在模型或控制器,你會打電話:

TargetDestructionService.new(EvilRobot.new, Human.new).execute 

這裏是一個關於它的好文章:https://blog.engineyard.com/2014/keeping-your-rails-controllers-dry-with-services

1

這個問題可能會進入雜草,因爲它會帶來很多個人偏好。然而,這是我的承擔。

首先,擔憂不是服務類別的替代品。關注點是一種乾淨而漂亮的方式來管理你的混合。如果您對Ruby不熟悉,則混合基本上是將實例和/或類方法注入現有類中的一種方法。例如,考慮到這些類:

class EvilRobot < ActiveRecord::Base 
    def destroy(target) 
    ... 
    end 
end 

class OrneryTeenAger < ActiveRecord::Base 
    def destroy(target) 
    ... 
    end 
end 

,你可以幹出代碼:

require 'active_support/concern' 
module EvilTools 
    extend ActiveSupport::Concern 

    included do 
    def destroy(target) 
     ... 
    end 
    end 
end 

class EvilRobot < ActiveRecord::Base 
    include EvilTools 
end 

class OrneryTeenAger < ActiveRecord::Base 
    include EvilTools 
end 

我認爲絕大多數的Rails開發者,包括我自己,去脂肪模型,薄控制器設計。胖子雖然是一個品味問題。我也傾向於將功能移到lib下的類,如果它們不適合邏輯上在模型中,或者提取到引擎或gem中。