2012-05-03 29 views
0

我正在製作一個Ruby on Rails應用程序,並且無法設置我的模型的某些屬性。問題是我有一個:before_save方法,但由於某種原因,encrypted_pa​​ssword和salt沒有保存到數據庫中。這裏的模型:爲什麼我的Ruby on Rails模型的屬性沒有使用before_save設置?

class User < ActiveRecord::Base 
    attr_accessor :password 
    attr_accessible :username, :email, :password 

    before_save :encrypt_password 

    ... 

    private 
     def encrypt_password 
     logger.debug "Got to encrypt_password 1" 
     logger.debug "encrypted_password is #{ @encrypted_password }" 

     if @encrypted_password != nil and @encrypted_password != "" 
      return # @encrypted_password was already set 
     end 

     logger.debug "Got to encrypt_password 2" 
     @salt = make_salt if new_record? 
     logger.debug "New salt = #{ @salt }" 
     @encrypted_password = encrypt(@password) 
     logger.debug "New encrypted_password = #{ @encrypted_password }" 
     @password = "(encrypted)" 
     logger.debug "Got to encrypt_password 3" 
     end 

在日誌文件中,我看到以下內容:

Started POST "/users" for 127.0.0.1 at Wed May 02 22:55:20 -0500 2012 
    Processing by UsersController#create as HTML 
     Parameters: {"commit"=>"Submit", "authenticity_token"=>"RY9fSMqb2+tdQ0fIjiEz8cfMTWTi012vCWdCvbxACLk=", "utf8"=>"\342\234\223", "user"=>{"username"=>"test6", "password"=>"[FILTERED]", "email"=>"[email protected]"}} 
     [1m[36m (0.1ms)[0m [1mbegin transaction[0m 
     [1m[35mUser Exists (0.2ms)[0m SELECT 1 FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
    Got to encrypt_password 1 
    encrypted_password is 
    Got to encrypt_password 2 
    New salt = 4f3464029393829aa562e533773f668c8471c51231611f6f214e654275f37184 
    New encrypted_password = 0dafcff2fe75bb6f2b53afda79789cfe13bd3f733b817a0e2e30df98af5829bc 
    Got to encrypt_password 3 
     [1m[36mSQL (0.5ms)[0m [1mINSERT INTO "users" ("created_at", "email", "encrypted_password", "is_done", "last_seen", "salt", "updated_at", "username") VALUES (?, ?, ?, ?, ?, ?, ?, ?)[0m [["created_at", Thu, 03 May 2012 03:55:20 UTC +00:00], ["email", "[email protected]"], ["encrypted_password", nil], ["is_done", false], ["last_seen", nil], ["salt", nil], ["updated_at", Thu, 03 May 2012 03:55:20 UTC +00:00], ["username", "test6"]] 
     [1m[35m (0.7ms)[0m commit transaction 
    Redirected to http://localhost:3000/ 
    Completed 302 Found in 7ms (ActiveRecord: 1.4ms) 

所以它肯定使鹽和加密的密碼。但數據庫沒有得到更新?!

>> User.find(6) 
=> #<User id: 6, username: "test6", email: "[email protected]", encrypted_password: nil, is_done: false, salt: nil, last_seen: nil, created_at: "2012-05-03 03:55:20", updated_at: "2012-05-03 03:55:20"> 
+0

您正在使用哪種版本的導軌? – Suborx

+0

@Suborx - Rails 3.2.3 –

回答

2

嘗試使用self.encrypted_password

的ActiveRecord讓getter/setter方法爲您的屬性,即

def encrypted_password 
    ... 
    # return something from the db 
end 

def encrypted_password=(x) 
    ... 
    # set something in the db to x 
end 

當你寫@encrypted_password,你實際上並沒有使用這些方法,所以數據庫沒有更新。

您可以在日誌中看到這一點:

[1m[36mSQL (0.5ms)[0m [1mINSERT INTO "users" ("created_at", "email", "encrypted_password", "is_done", "last_seen", "salt", "updated_at", "username") VALUES (?, ?, ?, ?, ?, ?, ?, ?)[0m [["created_at", Thu, 03 May 2012 03:55:20 UTC +00:00], ["email", "[email protected]ail.com"], ["encrypted_password", nil], ["is_done", false], ["last_seen", nil], ["salt", nil], ["updated_at", Thu, 03 May 2012 03:55:20 UTC +00:00], ["username", "test6"]]

saltencrpyed_password被設置爲無,因爲你沒有更新的屬性,您更新一類的成員變量。

+0

工作。我雖然沒有得到。如果這個函數在保存之前運行,那麼不應該在ActiveRecord中的save方法中找到該類的成員變量,然後在它保存時將它們保存到數據庫中? –

+0

ActiveRecord不保存類成員變量。它以列的形式看起來像成員變量的方式公開模型的數據庫表結構。根據你熟悉的ruby語法,'foo = self.encrypted_pa​​ssword'實際上是'foo = self.encrypted_pa​​ssword()',也就是說它不是一個方法調用,而不是一個成員。 – Soup

1

我想你忘了self.encrypted_password = @encrypted_passworddef encrypt_password的末尾。

+0

不是@encrypted_pa​​ssword是否與self.encrypted_pa​​ssword相同? –

相關問題