2016-08-13 55 views
0

我有一個模型:「事件」,它有一個控制器:「event_controllerRuby on Rails的:什麼是慣例(?有一個),用於創建模型實例編程

event_controller處理以下路線:事件/:ID/complete_event

在控制器中,我需要觸發建立在系統中的其他幾個模型對象,這是計算,而不是通過網絡的形式輸入。

在這種情況下,模型創建有:

  1. 得分(其belongs_to的:用戶事件
  2. 統計(其belongs_to的:事件
  3. 站立(其中belongs_to:用戶 |並基於新得分/統計對象)

,這是什麼類型的模型創造了Ruby on Rails的約定?

對於event_controller可以創建這些(有點無關的)模型對象嗎?

,或者

如若event_controller呼叫到score_controllerstats_controllerstanding_controller

第二個選項,我擔心它不能在鏈中分配2-3個路由來在其相應的控制器中創建所有對象,但這是慣例。

在最後,它是理想的,將用戶重定向回show_event視圖,它會顯示事件及其相關分數統計對象。

代碼爲event_controller方法:complete_event

def complete_event 
    event = Event.find(params[:id]) 
    if event.in_progress? 
    event.complete! 
    end 
    # 1. create score for each user in event.users 
    # 2. create stats for the event 
    # 3. update the overall standings for each score (per user) 
    redirect_to event 
end 

正如你所看到的,事件是不是被創造的這個動作,而事件狀態更新爲「完整的」,這是觸發創建關聯的記錄。上述

註釋行代表什麼,我需要做的事件後完成;我只是不知道這是我繼續前進,直接創建對象。

E.g.要創建得分我將不得不計算大量啓動事件,但使用很多模型來獲取所有的相關數據來創建它的數據。

+1

是,控制器可以創造任何他們想要的車型。沒有什麼阻止他們這樣做。他們不能直接調用其他控制器。只能間接地通過'redirect_to'或其他東西。我建議你閱讀更多的導軌指南/教程。顯然,這些概念在你的腦海中仍然有點模糊。 –

+0

我認爲這不應該在控制器中完成。相反,你的控制器可以調用一個Builder,它可以在一個方法中創建所有相關和相關的對象或者您的事件模型可以在創建時自己生成所有需要的耦合對象。或者,當您第一次訪問它們時,它可能會創建它們。 – spickermann

+0

@SergioTulentsev我已經研究過Rails指南並且一直在關注幾個教程;但沒有一個真正強調或解決這個特定的情況。如果您有任何有用的參考鏈接。 – dannbeau

回答

0

您可以將整個邏輯控制器出來,這樣我可以當你調用even.completed明白了!您需要爲用戶創建分數並更新整個評分。因此,請在模型after_update is_event_completed中添加回調!假設evet.com已完成!將在db級別標記事件完成。然後,將相應的邏輯放入模型中。將業務邏輯放入模型是最佳實踐。這是管理模型github.com/pluginaweek/state_machine的狀態以及針對特定事件做具體事情的好寶石。

+0

你可以將整個邏輯移出控制器,所以當你打電話給even.completed時我​​能理解!您需要爲用戶創建分數並更新整個評分。因此,請在模型after_update is_event_completed中添加回調!假設evet.com已完成!將在db級別標記事件完成。然後,將相應的邏輯放入模型中。將業務邏輯放入模型是最佳實踐。這是管理模型https://github.com/pluginaweek/state_machine的狀態以及在特定事件上執行特定事情的好材料。 –

+0

感謝Muaaz Rafi,我已經編輯了這個問題以包含狀態更新的代碼。 – dannbeau

0

這種感覺對我來說,所有的步驟都完成的事件的一部分,因此,我認爲它屬於到Event#complete!方法。

# in the controller 
def complete_event 
    event = Event.find(params[:id]) 
    event.complete! if event.in_progress? 
    redirect_to event 
end 

# in the model 
def complete! 
    # complete event 

    # 1. create score for each user in event.users 
    # 2. create stats for the event 
    # 3. update the overall standings for each score (per user) 
end 

或者你可以使用執行完成一個小的Ruby類:

# in the controller 
def complete_event 
    event = Event.find(params[:id]) 
    EventCompleter.new(event).perform 
    redirect_to event 
end 

# in models/event_completer.rb 
class EventCompleter < Struct.new(:event) 
    def perform 
    event.complete! 

    # 1. create score for each user in event.users 
    # 2. create stats for the event 
    # 3. update the overall standings for each score (per user) 
    end 
end 

第二似乎對這個簡單的例子有點太複雜,但對於更復雜的任務一個有趣的模式。主要的好處是,這個簡單的Ruby類封裝了完成一個事件時所需要完成的所有業務和領域邏輯(這個邏輯並不屬於事件)。而且它更容易測試。

相關問題