簡體   English   中英

跟蹤多個控制器動作

[英]Rails multiple controller actions

Rails處理“多個控制器動作”的方式是什么? 在我的應用程序中,我有一個特殊的“購物車”流程,該流程對多個模型都有影響。 基本上,特殊用戶在登錄后就可以使用該流程,其流程如下:

  1. 添加用戶。
    • 在這里可以“添加用戶”。 如果您了解Basecamp,則此步驟有點像向項目中添加人員。 因此,在這一步中,我正在考慮用戶資源。
  2. 在這里,可以為每個先前添加的用戶“購買”東西。
    • 這有點像基本的購物車。 因此,就資源而言,我正在考慮“商店”或“購物車”。
  3. 這是一個確認步驟。 我再次將其視為購物車的一部分。

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

  1. 應該以某種方式激活在步驟1中添加的用戶。 也就是說,他們在激活之前將無法登錄。
  2. 在第2步中應從購買中下訂單。
  3. 您在第2步中購買的“東西”是某種虛擬產品。 即,當用戶登錄時,產品顯示為“邀請”。其細節不是太重要,並且有點難以解釋。 關鍵是,確認后,應在數據庫中創建與用戶相關聯的邀請。

同樣,系統的細節有些難以解釋,但是我的主要問題是如何在Rails中最好地實現這種功能。 其中涉及多個步驟,並且影響所有步驟的多個模型。

我一直在考慮使用某種狀態機來做到這一點。 然后,狀態機將負責在步驟或狀態之間進行轉換,並執行所需的操作。 所以我想我會有一個StateMachineController或沒有模型的東西,它將實現主要邏輯。 這有什么用嗎? 看起來Rails確實偏向RESTfull資源,但是我似乎無法想到針對RESTful這樣的方法。 謝謝。

將控制器動作視為用戶引起的事件。 此后發生的是通常應與一個或多個模型關聯的邏輯。

因此,下訂單是Order模型中的事情,激活用戶是在User模型中,發送邀請是在Invitation模型中,依此類推。 模型彼此了解並沒有錯。 當一個事件跨越多個模型時,我將一種方法放在與用戶引起的事件最相關的一種方法中,可能是諸如Order中的“ purchase”之類的方法,這就是您從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

通過在事務中完成所有操作,您的數據要么全部正確,要么不正確。

這樣的東西?

暫無
暫無

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

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