2012-12-19 74 views
2

我有一個很長的窗體填充的軌道模型(使用邪惡嚮導寶石分割)。如何在表單完成時觸發「已完成」屬性?

有一些驗證,但我允許在大多數領域空白。

我需要採取某些措施,如果保存模型但某些字段保持空白(例如記住用戶完成表單)以及其他一些操作,如果表單100%完成(例如向用戶發送電子郵件讓他知道表格是完整的)。

我的想法是觸發一個虛擬屬性,如:完成如果我的模型中沒有空白字段,但我不知道如何以及在哪裏做到這一點。

任何提示?

========================= 編輯

感謝@Kzu建議,我發現這對我的工作精靈控制器

def update 
    @customer = current_user.customer 
    params[:customer][:complete] = @customer.attributes.select{|key,value| value.nil? or !value.present? }.any? ? false : true 
    @customer.attributes = params[:customer] 
    render_wizard @customer 
    end 

回答

1

例如,你可以使用一個ActiveRecord的回調和完整布爾場這種形式(也可以在對象控制器本身的工作)。

before_save :check_if_complete 
def check_if_complete 
    # self.attributes returns a hash including the attribute name as key and its value as value 
    completion = self.attributes.select{|key,value| value.nil? or value.blank?} ? false : true 
    self.complete = completion 
end 

該解決方案可以正常工作,但可以處理數據庫中的不同屬性類型。

+0

由於某種原因,將它放入before_save中會阻止我的嚮導進入下一步。如果你看看我的編輯,我使它在控制器中工作,並做了一些小的調整。我使用| value.present,因爲value.blank在false布爾值上返回true,所以完整屬性本身會阻止它自己工作。我還加了.any?否則空數組返回true。感謝您的幫助! – TopperH