2008-10-14 37 views
5

我遇到了許多領域,has_many協會,圖像通過image_column等增加了一個相當複雜的模型......多頁形式

新對象將多頁的形式加入(8級) - 我應該如何完成這些步驟之間的驗證和傳播?

我認爲validation_group可能對定義每一步的驗證有用,那麼整體設計呢?

回答

6

對於整體設計,您可能希望查看Presenter圖層的概念(Jay Fields在其博客條目Rails: Presenter Pattern中對其進行了定義),以便在處理複雜/多個模型時保持控制器精簡和視圖愚蠢。

4

你可以有一系列的方法,例如, step_1,step_2,並且每個人都檢查以確認上一步中的必要數據已提交。您可以將數據存儲在會話中,以便例如第3步仍然可以訪問在第1步中收集和解析的所有數據。在最後一步中,將所有存儲在會話中的數據加上數據從倒數第二步開始使用,並在數據庫中創建一個新行,或者爲數據收集任何內容。如果用戶弄錯了一個步驟,將它們重定向到上一步,並用他們填寫的數據填寫表格。例如如果用戶混淆第2步並提交導致第3步的表單,請在step_3方法中捕獲問題,將用戶重定向到step_2方法,並確保預填充了第2步中的表單元素。

如果您不想隨時在會話中存儲數據,則可以在用戶提交步驟1之後創建新的數據庫行,並且在每次連續收集新數據時更新該行中的字段步。你可以在行上標記'完整',初始設置爲0,然後在用戶成功完成所有步驟後將其設置爲1。

您還可以允許用戶進入前面的步驟(例如,讓用戶在步驟5時返回步驟3)。

假設你的第一步有一個帶有'姓名'和'電子郵件'字段的表單。在您的step_2方法中,您應該驗證params[:name]和​​已通過並且有效。將它們存儲在會話或數據庫行中,但是您選擇了。然後在步驟2中,您有一個表格,其中包含「年齡」和「性別」字段。在您的step_3方法中,您應驗證params[:age]params[:gender]已通過且有效,並且還需要確保用戶已完成第1步,以防止用戶直接輸入URL以訪問步驟3。等等。

+0

我使用這種方法,因爲我的表單包含文件上傳字段。就我而言,走這條路線比處理會話要容易得多。 – 2011-05-04 20:56:41

0
class Campaign < ActiveRecord::Base 
    with_options(:if => lambda { |campaign| campaign.on_or_past_step(:spam_can) }) do |spam_can| 
     spam_can.validates_associated :spam_can 
     spam_can.validates_presence_of :spam_can 
    end 
    def on_or_past_step 
    : 
    : 
    end 
end 

這是一個正在進行的工作,但我覺得我走在正確的軌道上。我正在使用AASM狀態來確定要運行哪些驗證。我仍然沒有弄清楚路線應該如何工作,因爲我所討論的模型是一種資源。例如,哪組字段應該是編輯操作?