2012-11-16 108 views
0

什麼是Rails處理「多控制器動作」的方式?在我的應用程序中,我有一個特殊的「購物車」流程,它對幾個模型有影響。基本上,當他/她登錄時特定種類的用戶可以使用流程,並且如下所示:Rails多控制器動作

  1. 添加用戶。
    • 這裏可以「添加用戶」。如果您瞭解Basecamp,這一步有點像將人添加到項目中。所以在這一步,我正在考慮用戶資源。
  2. 這裏可以爲每個以前添加的用戶「購買」東西。
    • 這就像一個基本的購物車。所以,就資源而言,我正在考慮「商店」或「購物車」。
  3. 這是確認步驟。我再次想到這是購物車的一部分。

確認後,應該發生幾件事。

  1. 步驟1中添加的用戶應該以某種方式被激活。也就是說,在激活之前他們將無法登錄。
  2. 應在步驟2中購買訂單。
  3. 在步驟2中購買的「材料」是某種虛擬產品。也就是說,產品在用戶登錄時顯示爲「邀請」。這些細節並不太重要,有點難以解釋。關鍵是,確認後,應在數據庫中創建與用戶關聯的邀請。

此外,系統的細節有點難以解釋,但我的主要問題是如何在Rails中最好地實現這種類型的東西。涉及多個步驟,並影響所有步驟中的幾個模型。

我一直在想着用某種狀態機來做這件事。然後,狀態機將負責在這些步驟或狀態之間轉換,並執行所需的操作。所以我想我會有一個StateMachineController或其他東西,沒有模型,將實現主要邏輯。這是可以使用的嗎?看來Rails確實偏向於RESTfull資源,但我似乎無法想象上述類似的RESTfull方法。謝謝。

+0

我有一個答案正在進行,但意識到它太模糊不實用。我的一般迴應是你應該保留你的模型中的狀態信息,並且在那裏確定邏輯的狀態(無論是狀態機還是簡單的流程)。這聽起來很像我的一個「邀請」過程 - 你「邀請」一個潛在的新用戶,並給他們虛擬的東西。但是他們只有在註冊並確認之後才能得到這些東西。這種流程在Devise gem中出色地完成了(我認爲有一個「invitable」模塊)。檢查出來的靈感。 –

+0

感謝您的回覆。你對邀請系統絕對正確。實際上我使用Railscast#196作爲靈感來源,因爲我有自己的認證系統,不能/不會使用Devise(不是我認爲Devise不錯)。我的主要問題仍然是如何處理「控制多個模型」。我需要這樣一些內容:在步驟3中按下OK後:下訂單,激活用戶,發送邀請等等。因此,可能的一些操作(跨越用戶,邀請和訂單模型)在單個交易中彙總。但是,謝謝。 – Kasper

回答

1

將控制器操作視爲用戶導致的事件。之後會發生什麼是通常應該與一個或多個模型相關聯的邏輯。

因此,在Order模型中放置一個訂單,在User模型中激活用戶,在Invitation模型中發送邀請等等。讓模特瞭解彼此沒有錯。當一個事件跨越多個模型時,我將一個方法放在與用戶引起的事件最密切相關的方法中,可能是Order中的「購買」方法,這就是您要從Order控制器調用的方法。

因此,如果有在其他車型狀態的依賴,建立小法在他們測試(如果需要),如用戶activated?,和別人做的工作,如activate(即更新用戶狀態),然後在邀請中「邀請」,以保存與用戶關聯的新邀請,等等。如果他們失敗了,請確保他們提出異常。

一旦你有很多很好的粒度方法,你可以將它們捆綁在一起,甚至將它們包裝在Order#purchase方法中的事務中。類似於

def purchase(user, stuff, invitee) 
    Order.transaction do 
    begin 
     invitee.activate 
     invitation = Invitation.create! {:invitee => invitee, :stuff => stuff, :invited_by => user } 
     # You can't roll back an email, so do this after the others have worked without exception 
     invitation.send 
    rescue 
     ActiveRecord::Rollback 
    end 
    end 
end 

通過在交易中完成所有操作,您的數據無論是全部正確還是不正確。

有點像這樣嗎?

+0

我想我明白你的意思。所以,有這樣的模型「交流」,我想我可以讓它工作。我對Rails相當陌生,而且我認爲,瞭解它最難的部分是理解什麼是「好」導軌,什麼是「壞」導軌。順便說一下,R​​ails中是否存在某種Oberver模式?謝謝。 – Kasper

+0

嗯,猜我可以只是谷歌的Rails觀察員模式:) – Kasper

+0

要看「良好的Rails」看看寶石和Rails本身的源代碼。大多數情況下,如果它看起來不錯 - 不,認真。簡短的小方法,乾淨的一致性等等。是的,Rails有觀察者,但我不明白他們被廣泛使用 - 他們擅長解耦電子郵件發送等。二者之間的排序可能在過濾器之前/之後/周圍 - 並不完全相同,但似乎是避免過多的if/else邏輯混淆其他簡單方法的更常見的方法。 –