2014-02-09 35 views
0

我跟隨Michael's Ruby on Rails tutorial (Chapter 6.2.2),當我去rails console --sandbox嘗試創建用戶時,輸出完全過時。Rails控制檯輸出髒/過時的數據

我更新了一個用戶的屬性,我返回用戶和控制檯輸出nil所有屬性。但是,如果我輸出user.attribute的數據在那裏。

第一次保存失敗,因爲用戶必須有一個名稱,但即使在addind驗證之前我有這個問題。

缺少什麼我在這裏?我遵循了所有的指示,我正在做非常基本的東西。我執行以下命令:

$ rails console --sandbox 
Loading development environment in sandbox (Rails 4.0.2) 
Any modifications you make will be rolled back on exit 

2.1.0 :001 > user = User.new(name: "", email: "[email protected]") 
=> #<User id: nil, name: nil, email: nil, citizen_number: nil, created_at: nil, updated_at: nil> 
2.1.0 :002 > user.save 
    (0.1ms) SAVEPOINT active_record_1 
    (0.2ms) ROLLBACK TO SAVEPOINT active_record_1 
=> false 
2.1.0 :003 > user.valid? 
=> false 
2.1.0 :004 > user.name = "Bob" 
=> "Bob" 
2.1.0 :005 > user.valid? 
=> true 
2.1.0 :006 > user 
=> #<User id: nil, name: nil, email: nil, citizen_number: nil, created_at: nil, updated_at: nil> 
2.1.0 :007 > user.save 
    (0.2ms) SAVEPOINT active_record_1 
    SQL (6.2ms) INSERT INTO "users" ("created_at", "updated_at") VALUES (?, ?) [["created_at", Sat, 08 Feb 2014 19:15:37 UTC +00:00], ["updated_at", Sat, 08 Feb 2014 19:15:37 UTC +00:00]] 
    (0.1ms) RELEASE SAVEPOINT active_record_1 
=> true 
2.1.0 :008 > user 
=> #<User id: 1, name: nil, email: nil, citizen_number: nil, created_at: "2014-02-08 19:15:37", updated_at: "2014-02-08 19:15:37"> 

我的用戶模型:

class User < ActiveRecord::Base 

    attr_accessor :name, :email, :citizen_number 

    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    VALID_CITIZEN_NUMBER_REGEX = /[1-9]\d{7,}/ 
    validates :name, presence: true, length: { maximum: 50 } 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } 
    validates :citizen_number, presence: true, format: { with: VALID_CITIZEN_NUMBER_REGEX }, uniqueness: true 

    before_save { lowercase_email() } 

    def lowercase_email() 
    self.email = email.downcase 
    end 

end 

回答

1

DiAlex,你有產生這個的代碼嗎?我想嘗試一下。由於問題實際上是在保存之前發生的,但是在「初始化」之後發生,所以我看不到重新加載或驗證如何重要。

更新:基於測試和來回你,我覺得你的問題是與attr_accessorattr_accessible濫用有關。

嘗試從attr_accessor中刪除:citizen_number。我試過了,你的代碼開始工作(通過所有的測試),控制檯也開始輸出正確的值。

+0

我繼續教程並忽略了這個問題,所以最新的源代碼有更多的驗證。儘管如此,你應該在這裏有一個非常穩定的版本:https://github.com/dialex/dcid/tree/288ac1608c97117ab766e6d2c4c051b084ea8804我也是一個n00b所以是的:P – dialex

+1

DiAlex - 我克隆了建模用戶分支(其他人不'沒有用戶模型)。事實上,我承認了同樣的錯誤和古怪,無論有沒有驗證。當我保存時,它會保存,但數據仍然很奇怪。在這裏查看結果(https://gist.github。com/jmcbri/9021295) – codenoob

+0

我還創建了一個全新的應用程序,並創建了一個用戶模型,並且它符合您的期望:(https://gist.github.com/jmcbri/9021337)現在我們必須弄清楚你的應用和默認設置有什麼不同。懷疑我可以做到這一點,但我會嘗試。 – codenoob

0

使用reload

user.reload應該給你最新的用戶提供正確的屬性,如解釋在Documentation中,它從數據庫重新加載此對象的屬性,因此您現在可以根據預期獲取對象屬性,如果它們保存正確ly

+0

由於未保存用戶,因此出現錯誤「ActiveRecord :: RecordNotFound:無法找到沒有ID的用戶」。控制檯應該(我猜)甚至在保存用戶之前輸出正確的數據。 – dialex

+0

那麼你可能不會保存用戶 – bjhaid

0

Diogo,有些東西阻止您的user.save。在user.save的第一次嘗試後,請嘗試user.errors。這會給你一個散列,以避免你的模型保存的錯誤。

由於user.valid?返回true,您很可能會在您的數據庫方案中發現錯誤。

0

您是否嘗試過沒有沙盒模式?也許它在某種程度上限制了寫作。

rails console 
+0

沒有解決問題:( – dialex