您好我是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>
那么如何在模型中创建新属性?
答案 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_accessible
与attr_accessor
混为一谈。前者是Rails如何保护属性不被大规模赋值,而后者是Ruby指令,它为实例变量创建读写器方法。
如果您只想在模型中使用实例变量,请使用attr_accessor
。如果要创建持久属性,将值存储到表中的列,请创建迁移并在其中添加列。
答案 2 :(得分:1)
我认为问题的出现是因为您只在开发数据库上更改了它,测试在每次运行测试套件时都会重置的单独数据库上运行。
创建一个migration,然后运行以下命令来迁移您的测试环境,或者忽略RAILS_ENV部分来进行开发:
rake db:migrate RAILS_ENV=test