2011-01-15 15 views
18

モデルは、これはモデルのコードで、パスワードの確認のためのチェックdoesen't、なぜ私が理解することはできません。バリデータ、パスワードの確認

class User < ActiveRecord::Base 
    attr_accessor :password_confirmation 
    validates :email, :presence =>true, 
        :uniqueness=>true 
    validates :password, :presence =>true, 
        :length => { :minimum => 5, :maximum => 40 }, 
        :confirmation =>true 
    validates_confirmation_of :password 
end 

コントローラが意図され、ビューからデータを取ります保存を実行しようとすると、これはビューのコードです。

<h1>Registration process</h1> 
<%= form_for(@new_user) do |f|%> 
<% if @new_user.errors.any? %> 
    <div id="errorExplanation"> 
    <h2><%= pluralize(@new_user.errors.count, "error") %> prohibited this article from being saved:</h2> 
    <ul> 
    <% @new_user.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
    <% end %> 
    </ul> 
    </div> 
    <% end %> 
    <%= f.label :email %><br /> 
    <%= f.text_field :email %><br /> 
    <%= f.label :password %><br /> 
    <%= f.password_field :password %><br /> 
    <%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation %> 
    <%#TODO Confirm password%> 

    <%= f.submit 'Join' %> 
<%end%> 

パスワードが一致しないとエラーは出力されません。

+0

と仕事を適切に

に動作します。 – Chamnap

+3

二重確認の検証が必要ですか?パスワードの検証で ':confirmation => true'を指定します。 – davemyron

+1

ええ...コードは私のためにも機能します(Chamnapによると)、password_confirmationバリデーターを二重にすることは、それがうまくいかない理由ではありません。 " – Daniel

答えて

35

私はちょうどこれも焼かれました。あなたの確認値がnilと思われます。

注:ドキュメントからこのチェックは password_confirmationがnilでない場合にのみ行われ、デフォルトで にのみに保存されます。検証があなたのためにそれを追加しているので、

は、あなたがattr_accessor :password_confirmationを必要としない: 確認を要求するには、確認 属性の 存在検査を追加してください。レール!

+0

ありがとう - これも私に胸焼けを与えていた! – Chip

+0

どうすればいいのですか? – Edward

1

質量割り当てを使用している場合は、パスワードをattr_accessibleに追加する必要があります。 attr_accessorが仮想属性を作成しますが、同じことが、我々はattr_accessiblepassword_confirmationを追加すべきではない質量割り当て Idealyのために使用することはできません、validates_confirmation_ofpasswordpassword_confirmationの値を検証する必要がありますがpassword_confirmationの値は、nillが来ています。私はattr_accessibleするpassword_confirmationを追加し、それが上記のコードは、私の作品のRails 3