如何在模型中创建新属性?
嗨我是新的红宝石和铁轨,我想为模型帐户创建一个新的属性电子邮件。 下面是我的新属性的测试。测试是名称属性测试的副本,但我认为他们将以类似的方式工作。如何在模型中创建新属性?
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>
那么如何在模型中创建一个新属性?
你必须创建一个迁移添加电子邮件列到表中并运行耙分贝:迁移
class AddSsl < ActiveRecord::Migration def self.up add_column :accounts, :email, :string end def self.down remove_column :accounts,:email end end
也是从那个手动添加表中删除的电子邮件列。
我从手动添加的数据库中删除了该列。我使用上面的代码在迁移文件夹中创建了一个新文件。我运行了rake db:migrate,但最终没有发生任何事情。有什么我忘记了吗? – 2010-11-15 14:18:52
迁移是否将电子邮件列添加到您的表中? 尝试将您的迁移转换为零并再次运行。另外,在运行迁移时提及RAILS_ENV =测试 – 2010-11-15 15:05:43
感谢大家,这解决了它! – 2010-11-16 13:54:10
我认为发生这个问题是因为您只是在开发数据库中更改了它,测试运行在每次运行测试套件时都会重置的独立数据库上。
做一个migration,然后运行以下命令来迁移测试环境,或离开了RAILS_ENV部分只是为了发展做:
rake db:migrate RAILS_ENV=test
我想你混淆attr_accessible
与attr_accessor
。前者是Rails如何保护属性不受大规模分配的影响,而后者则是为实例变量创建读写器方法的Ruby指令。
如果您只是想在模型中使用实例变量,请使用attr_accessor
。如果要创建一个持久属性,该值将存储到表中的列中,请创建一个迁移并在其中添加该列。
是否将电子邮件作为帐户模型的一部分列在您的db/schema.rb文件中? – Jimmy 2010-11-15 13:57:45