我正在从rails 3.0.7升级到3.1,并且无法通过测试。当我尝试在工厂中使用存根活动资源对象时,会发生此问题。
#employee.rb
class Employee < ActiveResource::Base; end
#task.rb
class Task < ActiveRecord::Base
belongs_to :employee
end
#factories.rb
Factory.define :employee do |e|
e.name "name"
end
Factory.define :task do |t|
t.employee { Factory.stub(:employee) }
end
在控制台和规范存根中,员工工作。在新任务中引用存根的员工对象会产生以下错误。
Factory.create( :task, :employee => Factory.stub(:employee) )
NoMethodError:
undefined method `[]' for #<Employee:0x007fc06b1c7798>
修改
这不是工厂女孩的问题。如果我在控制台中执行以下操作,则会收到相同的错误。
Task.new( :employee => Employee.first )
它必须与belongs_to如何映射id列有关。
答案 0 :(得分:5)
我不喜欢猴子补丁所以我创建了一个模块,我将在初始化时包含以扩展ActiveRecord
module BelongsToActiveResource
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def ar_belongs_to( name, options = {} )
class_eval %(
def #{name}
@#{name} ||= #{options[:class_name] || name.to_s.classify }.find( #{options[:foreign_key] || name.to_s + "_id" } )
end
def #{name}=(obj)
@#{name} ||= obj
self.#{ options[:foreign_key] || name.to_s + "_id" } = @#{name}.#{ options[:primary_key ] || 'id' }
end
)
end
end
end
ActiveRecord::Base.class_eval { include BelongsToActiveResource }
然后在每个ActiveRecord模型中看起来像:
#task.rb
class Task < ActiveRecord::Base
ar_belongs_to :employee
end
希望这有助于某人