2014-05-08 174 views
0

我與軌道玩一次發現這種行爲,當我創建了一些屬性的Post模型的新實例,它告訴我,所有的屬性都是零,爲什麼它是怎麼回事?Rails的新對象是零

Loading development environment (Rails 4.0.0) 
2.0.0-p451 :001 > a = Post.new(title: "Rails", content: "Rails Post") 
=> #<Post id: nil, title: nil, content: nil, author: nil, rating: nil, created_at: nil, updated_at: nil> 
2.0.0-p451 :002 > a.title 
=> "Rails" 
2.0.0-p451 :004 > a.content 
=> "Rails Post" 
2.0.0-p451 :005 > a.inspect 
=> "#<Post id: nil, title: nil, content: nil, author: nil, rating: nil, created_at: nil, updated_at: nil>" 
2.0.0-p451 :006 > a.errors.messages 
=> {} 
2.0.0-p451 :007 > a.valid? 
=> true 

class Post < ActiveRecord::Base 
    attr_accessor :title, :content, :author, :rating 
end 
+0

''development.log'裏有什麼?模型的外觀如何? – pawel7318

+3

檢查'a.errors.messages' – Nithin

+0

你的Post模型是什麼樣的? – sevenseacat

回答

1

您正在定義attr_accessor您的所有特性,這是定義爲同名像這樣的實例變量的getter和setter的快捷方式:

def content 
    @content 
end 

def content=(new_content) 
    @content = new_content 
end 

Rails會同時自動生成你具有這些名稱的方法,用於模型中的每個數據庫字段。這些方法會相互衝突。

當你調用post.content = 'foo',而不是調用Rails的生成方法將在內部設置模型的content屬性爲「富」,你調用將實例變量設置@content到「富」的attr_accessor -defined方法。

inspect輸出被遍歷的Rails定義的模型屬性,而不是實例變量。

你實際上意味着聲明這些屬性attr_accessible而不是attr_accessor

+0

是軌道4,5,所以沒有任何attr_accessible多,代碼工作正常,但鐵軌控制檯顯示彷彿一切後屬性是零,但我不爲什麼 – sescob27

+0

因爲模型屬性爲零。實例變量不是,如果要將數據保存到數據庫中,您也會得到nils。 – sevenseacat

+0

我解決了,有我在.irbrc文件的錯誤,我用Ruby 2.1.0的工作,但我必須安裝Ruby 2.0.0一個演示文稿,以便軌沒有找到對Ruby 2.1所列的寶石。 0 – sescob27