如何在模型中创建新属性?

时间:2010-11-15 13:54:38

标签: ruby-on-rails ruby rspec

您好我是ruby和rails的新手,我想为模型帐户创建一个新的属性电子邮件。 下面是我的新属性的测试。测试是名称属性测试的副本,但我认为他们将以类似的方式工作。

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>

那么如何在模型中创建新属性?

3 个答案:

答案 0 :(得分:2)

您必须创建迁移以将电子邮件列添加到表中并运行rake db:migrate

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

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

同时从您手动添加的表中删除电子邮件列。

答案 1 :(得分:2)

我认为你将attr_accessibleattr_accessor混为一谈。前者是Rails如何保护属性不被大规模赋值,而后者是Ruby指令,它为实例变量创建读写器方法。

如果您只想在模型中使用实例变量,请使用attr_accessor。如果要创建持久属性,将值存储到表中的列,请创建迁移并在其中添加列。

答案 2 :(得分:1)

我认为问题的出现是因为您只在开发数据库上更改了它,测试在每次运行测试套件时都会重置的单独数据库上运行。

创建一个migration,然后运行以下命令来迁移您的测试环境,或者忽略RAILS_ENV部分来进行开发:

rake db:migrate RAILS_ENV=test