2010-11-15 64 views
1

嗨我是新的紅寶石和鐵軌,我想爲模型帳戶創建一個新的屬性電子郵件。 下面是我的新屬性的測試。測試是名稱屬性測試的副本,但我認爲他們將以類似的方式工作。如何在模型中創建新屬性?

it "should have a email field" do 
    @account.email = "email" 
    @account = save_and_reload(@account) 
    @account.email.should == "email" 
end 

我對我所做的使測試通過的唯一的事情是創建帳戶模型中的電子郵件屬性。我還手動在數據庫帳戶表中插入了新的列電子郵件。

這裏就是我所插入的電子郵件屬性的帳戶型號代碼的一部分:

class Account < ActiveRecord::Base 
    attr_accessible :name, :logo, :account_preference_attributes,:email 

當我運行測試,我得到的錯誤NoMethodError「帳戶應該有一個電子郵件字段」

undefined method `email=' for #<Account:0xb6468ca8> 

那麼如何在模型中創建一個新屬性?

+1

是否將電子郵件作爲帳戶模型的一部分列在您的db/schema.rb文件中? – Jimmy 2010-11-15 13:57:45

回答

2

你必須創建一個遷移添加電子郵件列到表中並運行耙分貝:遷移

class AddSsl < ActiveRecord::Migration 
def self.up 
    add_column :accounts, :email, :string 
end 

def self.down 
    remove_column :accounts,:email 
end 
end 

也是從那個手動添加表中刪除的電子郵件列。

+0

我從手動添加的數據庫中刪除了該列。我使用上面的代碼在遷移文件夾中創建了一個新文件。我運行了rake db:migrate,但最終沒有發生任何事情。有什麼我忘記了嗎? – 2010-11-15 14:18:52

+0

遷移是否將電子郵件列添加到您的表中? 嘗試將您的遷移轉換爲零並再次運行。另外,在運行遷移時提及RAILS_ENV =測試 – 2010-11-15 15:05:43

+0

感謝大家,這解決了它! – 2010-11-16 13:54:10

1

我認爲發生這個問題是因爲您只是在開發數據庫中更改了它,測試運行在每次運行測試套件時都會重置的獨立數據庫上。

做一個migration,然後運行以下命令來遷移測試環境,或離開了RAILS_ENV部分只是爲了發展做:

rake db:migrate RAILS_ENV=test 
2

我想你混淆attr_accessibleattr_accessor。前者是Rails如何保護屬性不受大規模分配的影響,而後者則是爲實例變量創建讀寫器方法的Ruby指令。

如果您只是想在模型中使用實例變量,請使用attr_accessor。如果要創建一個持久屬性,該值將存儲到表中的列中,請創建一個遷移並在其中添加該列。