2012-07-09 211 views
1

我的問題如下:檢查一個屬性是否有效

我有一個表單視圖,它需要在提交後顯示成功和失敗圖標。 在提交之前,只需顯示沒有成功和失敗圖標的表單。

我們可以做這幾種方式的時候是這樣的形式:如果請求是一個POST

<%= form_for @resource do |f| %> 
    <div class='<%= set_class @resource, :name %>'> 
     Name: <%= f.text_field :name %> 
    </div> 
<% end %> 

檢查:

def set_class(record, attribute) 
     if request.post? 
      if record.errors[attribute].any? 
       return "FAILED" 
      else 
       return "SUCCESS" 
      end 
     end 
     # If not submitted, we don't want a class 
    end 

設置驗證後標誌(我們可以替代request.post?在以上解決方案用record.tried_to_validate):

class MyModel < ActiveRecord::Base 

     after_validation :set_tried_to_validate 

     attr_accessor :validated 

     def set_validated 
      @tried_to_validate = true 
     end 

    end 

但是我真的不喜歡ke這些解決方案..

是否有一個內部的Rails方法來檢查驗證過程是否完成?

+1

你能詳細說明驗證和通過的區別嗎? – 2012-07-09 14:12:47

+0

已驗證的屬性已嘗試保存..通過和失敗的屬性在保存後是否有效..未驗證的屬性尚未嘗試保存,它們是第一次被用戶查看.. – 2012-07-09 14:27:51

回答

4

你可以先測試其有效性..

@form.valid? 

將生成存儲在您的@form「錯誤」的錯誤。要查看是否在特定領域存在錯誤,

@form.errors[:some_field] 

在您的形式,你可以簡單地做!

<% if @form.errors[:some_field].empty? %> 
    Valid 
<% end %> 

只要某些領域產生錯誤,整個形式將是有效的?所以你會恢復顯示錶單(:新),你可以'有效'或複選標記。

+0

我知道,但是當第一次構建表單時(沒有任何驗證)我不想查看屬性是否通過了驗證..我不想在那裏使用'valid?',因爲所有驗證都是在用戶擁有之前完成的做了任何事情..如果用戶填寫了表單的一些領域並提交了它,那麼它需要顯示一個勾號或一個十字。 – 2012-07-09 14:29:56

+0

還是有點困惑。原諒我。如果表格是第一次構建,我會認爲沒有什麼是有效的,絕對有效的?不會是真的。 – 2012-07-09 17:58:31

+0

對不起,可能是我解釋錯了。當我第一次創建表單時調用'valid?',一切都是無效的,我不想向用戶顯示。所以我需要只有在表單已經提交併試圖驗證字段時才調用'errors.any?'或'valid?'。 – 2012-07-10 10:49:24

0

我認爲你正在尋找類似客戶端驗證的東西,如果想驗證在窗體上顯示內聯。 http://railscasts.com/episodes/263-client-side-validations

編輯

如果你想捕捉的3個階段,你可以在你的數據庫保存。新建,驗證,完成並僅使用回調保存每個階段並將默認設置爲新。 (您將有變化的驗證屬性字符串的數據類型)

after_validation更新屬性爲「驗證」

after_save的更新屬性設置爲「已完成」

然後,你可以,如果ELSIF其他使用條件來檢查該屬性的值並呈現刻度和交叉。顯然,這不是很漂亮,你應該只使用有效的?和錯誤?助手。

+0

我已經驗證了所有驗證。我需要知道的是記錄是否被驗證。我現在使用的解決方案是一種名爲'after_validation'的方法,它將一個名爲'validated'的屬性設置爲true。但我不太喜歡這個解決方案.. – 2012-07-09 15:07:19

+0

你想如何在視圖中顯示驗證?你有沒有在你的表單中調用error_messages? – 2012-07-09 15:09:10

+0

是的,好吧,就像這樣:'raw ff.object.errors [field_name] .collect {| e | content_tag(:div,e,class:「error」)} .join',但在此之後顯示字段..並且它需要一個類'bad'(如果無效),'good'(如果有效)或沒有課,如果還沒有驗證(第一次查看).. – 2012-07-09 15:12:12