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
Vous devez vous connecter pour publier un commentaire.
La encrypt_password méthode est incorrecte, il faut lire:
Notez l'utilisation de l'auto, qui permettra de définir correctement l'attribut de l'utilisateur de l'objet plutôt que de créer une variable d'instance qui est oublié.
OriginalL'auteur nmunson
C'est une vieille question, et ce n'est plus un commentaire, mais je n'ai pas assez de réputation de commentaire pour le moment. Voulais juste le lien entre cette question de trop car il va dans quelques détails sur
self
.Pourquoi n'est-il pas de soi toujours besoin de ruby /rails /activerecord?
OriginalL'auteur Andrew Haust