假设我有一个班级Try
。然后我尝试创建其对象以在rspec文件中的一个示例中使用它。
我尝试编写let(:obj){obj = Try.new()}
然后在示例中访问它,但它给出了错误。但是,当我写llet(:obj){obj = Try.create}
时,我可以使用obj
并调用其函数而不会出现任何错误。
当我在rspec文件中写为Try.create
和Try.new()
时有什么区别?
答案 0 :(得分:3)
来自ActiveRecord::Base文档:
create(attributes = nil) {|object| ...}
如果验证通过,则创建一个对象(或多个对象)并将其保存到数据库。无论对象是否已成功保存到数据库,都会返回结果对象。
new(attributes = nil) {|self if block_given?| ...}
可以将新对象实例化为空(传递无构造参数)或使用属性预先设置但尚未保存(传递具有与关联表列名匹配的键名的哈希)。在这两种情况下,有效的属性键由关联表的列名确定 - 因此您不能拥有不属于表列的属性。 因此,create实例化新对象,验证它,然后将其保存到数据库中。 new只创建本地对象,但不会尝试验证或将其保存到DB。