2011-06-13 16 views
8

Michael Hartl'ın RoR eğitimini takip ediyorum ve şifre şifrelemesinin temellerini ele alıyor. Sonra yazdımRaylar - before_save çalışmıyor?

(şifrelemek yöntem gerçekten uygulanmadı için Açıkçası bu hiç şifreleniyor yapmıyor ama bu benim soru değil)

class User < ActiveRecord::Base 
    attr_accessor :password 

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

    email_regex = /^[A-Za-z0-9._+-][email protected][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 

: bu haliyle bu Kullanıcı modelidir (öğretici göre) aşağıdaki Spektroskopisi: bu testlerin

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 

birinci geçer, ancak @user.encrypted_password sıfır olduğundan, ikinci test başarısız olur. Ama neden encrypt_password yönteminin before_save tarafından çağrıldığından nil olduğunu anlamıyorum. Biliyorum bir şey eksik olmalıyım - birisi açıklayabilir mi? encrypt_password yöntemi yanlış

cevap

20

, bu şöyle olmalıdır:

def encrypt_password 
    self.encrypted_password = encrypt(password) 
end 

Not doğru unutulur bir örnek değişkeni oluşturmak yerine kullanıcı nesne için nitelik ayarlayacaktır öz kullanımı.

+1

Sana "kabul cevabı" verdi ama o çözmek istiyorsanız hala benim takip soru burada yani bu kavramsal sorunlar yaşıyorum: http://stackoverflow.com/questions/6327174/rails-self-vs :) Puan kazanmak için başka bir fırsat. – Kvass

İlgili konular