我遇到了許多領域,has_many
協會,圖像通過image_column
等增加了一個相當複雜的模型......多頁形式
新對象將多頁的形式加入(8級) - 我應該如何完成這些步驟之間的驗證和傳播?
我認爲validation_group
可能對定義每一步的驗證有用,那麼整體設計呢?
我遇到了許多領域,has_many
協會,圖像通過image_column
等增加了一個相當複雜的模型......多頁形式
新對象將多頁的形式加入(8級) - 我應該如何完成這些步驟之間的驗證和傳播?
我認爲validation_group
可能對定義每一步的驗證有用,那麼整體設計呢?
對於整體設計,您可能希望查看Presenter圖層的概念(Jay Fields在其博客條目Rails: Presenter Pattern中對其進行了定義),以便在處理複雜/多個模型時保持控制器精簡和視圖愚蠢。
你可以有一系列的方法,例如, 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。等等。
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狀態來確定要運行哪些驗證。我仍然沒有弄清楚路線應該如何工作,因爲我所討論的模型是一種資源。例如,哪組字段應該是編輯操作?
我使用這種方法,因爲我的表單包含文件上傳字段。就我而言,走這條路線比處理會話要容易得多。 – 2011-05-04 20:56:41