Rails — before_save pas de travail?

Je suis Michael Hartl du RoR tutoriel, et il couvre les bases de cryptage de mot de passe. C'est le modèle de l'Utilisateur tel qu'il est actuellement:

class User < ActiveRecord::Base
    attr_accessor :password

    attr_accessible :name, :email,: password, :password_confirmation

    email_regex = /^[A-Za-z0-9._+-]+@[A-Za-z0-9._-]+\.[A-Za-z0-9._-]+[A-Za-z]$/
                                              #tests for valid email addresses.

    validates :name, :presence => true,
                     :length => {:maximum => 50}
    validates :email, :presence => true,
                      :format => {:with => email_regex},
                      :uniqueness => {:case_sensitive => false}
    validates :password, :presence => true,
                         :length => {:maximum => 20, :minimum => 6},
                         :confirmation => true

    before_save :encrypt_password

    private

        def encrypt_password
            @encrypted_password = encrypt(password)
        end

        def encrypt(string)
            string
        end
end

(Évidemment, ce n'est pas tout chiffrer, car le cryptage de la méthode n'est pas vraiment mis en œuvre, mais ce n'est pas ma question)

J'ai ensuite écrit la spécification suivante (selon le tutoriel):

require 'spec_helper'

describe User do

    before(:each) do
        @attr = { :name => "Example User", :email => "[email protected]",
                  :password => "abc123", :password_confirmation => "abc123"}
    end

    describe "password encryption" do

        before(:each) do
            @user = User.create!(@attr) # we are going to need a valid user in order
                                        # for these tests to run.
        end

        it "should have an encrypted password attribute" do
            @user.should respond_to(:encrypted_password)
        end

        it "should set the encrypted password upon user creation" do
            @user.encrypted_password.should_not be_blank
        end

    end
end

La première de ces tests de passe, mais depuis @user.encrypted_password est nul, le deuxième test échoue. Mais je ne comprends pas pourquoi il est nul depuis le encrypt_password méthode doit être appelée par before_save. Je sais que je dois être en manque de quelque chose-quelqu'un peut-il expliquer?

OriginalL'auteur Kvass | 2011-06-13