2011-05-16 54 views
6

我已經有client_side_validations gem在我的表單上工作得很棒。我爲我的用戶模型使用Devise,當我進入edit_user_registration表單時,除了:current_password,:password和password_confirmation字段之外的所有內容都會進行驗證。Rails 3:client_side_validations寶石和設計密碼驗證

堡實例是我留下電子郵件空白,驗證彈出右側,當我退出領域。但是,如果我將current_password字段留空並且沒有任何事情發生,那麼當我提交表單時,我會收到錯誤「1個錯誤禁止此用戶保存:密碼不能爲空」

感謝任何幫助

http://pastie.org/1907464

回答

14

目前ClientSideValidations會過濾掉任何有條件的驗證。設計設置一些驗證器爲條件:https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb#L24-32

我這樣做的原因是因爲沒有好的方法讓客戶端確定該條件的真實值。我可以在表單生成時做到這一點,但如果條件依賴於可以在表單上更改的值,該怎麼辦?所以我選擇過濾它們,讓它回落到服務器上。

這是主意,但顯然它對某些事物施加了不公平的限制。這是最明顯的(和受歡迎的)。

因此,我打算很快發佈一個新版本,這將允許您顯式重寫條件過濾器。它的工作是這樣的:

<%= f.text_field :password, :validate => { :presence => true, :confirmation => true } %> 

​​

在您可以選擇驗證器來關閉過濾器尚屬首例。在第二種情況下,它將關閉該屬性上所有驗證器的過濾器。條件將在表單生成時進行評估,如果通過,則會將驗證器添加到輸入元素以供客戶端使用。

+0

我最近嘗試過使用您建議的方法,可悲的是它沒有奏效。我最終將這添加到我的模型中:'如果we_need_to_validate_some_more; validates_presence_of:not_always_important_field; end'。像服務器端的魅力一樣工作,它會被你的寶石拾起。 – dimitarvp 2012-07-26 17:30:58

+0

這個評論是一年多以前,最有可能不再有效 – bcardarella 2012-08-01 21:45:18

4

主分支現在支持這種格式。把你的Gemfile指向它,你應該很好

+0

非常感謝我現在工作。附註:有沒有辦法顯示驗證通過時的通知?那麼我可以用紅色來表示失敗,綠色表示成功嗎? – 2011-05-21 00:30:32

+0

你會想要使用回調。 https://github.com/bcardarella/client_side_validations/wiki/Callbacks – bcardarella 2011-05-24 06:46:53

+0

嗨,我注意到client_side_validations只在<%= f.password_field:password%>上調用,而不是在<%= f上調用。password_field:password_confirmation%>。因此,如果我從password_confirmation字段中退出,則不顯示任何內容。有沒有一種方法來驗證密碼和password_confirmation匹配?或者至少一個password_confirmation驗證? – 2011-06-17 22:53:35

0

很簡單! gem擴展了Rails的默認表單構建器,你所要做的就是在任何需要內聯驗證的form_for(或簡單表單用戶的simple_form_for)標籤上設置:validate => true選項。表單構建器在你的模型驗證中使用一些rails反射來生成一些json,這些json會在表單之後被包含在腳本標記中。 json然後被gem的Javascript框架用來執行需要執行的驗證。

<%= form_for(@user, :url => registration_path(resource_name), :validate => true) do |f| %>