我正在看铁路工厂,并且在理解这段代码时遇到了问题:
Factory.define :user do |f|
f.username "foo"
f.password "foobar"
f.password_confirmation { |u| u.password }
end
我理解除了
之外的一切机制f.password_confirmation { |u| u.password }
在我使用“foobar”作为自定义密码的情况下,如何知道将“foobar”分配给f.password_confirmation。或者换句话说,“你”引用了什么。提前致谢。
答案 0 :(得分:2)
在这种情况下,“u”实际上代表一个“Evaluator”类,它是factory_girl使用的内部代理。它是一个动态定义的类,它响应您在工厂中定义的属性的方法。
Evaluator允许您访问先前定义的属性值,如果属性乱序,它将生成,缓存并返回正确的值。例如,交换“password”和“password_confirmation”的顺序仍然有效,因为Evaluator的工作方式。
您可以在此处查看Evaluator的工作原理:https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/evaluator.rb
在定义工厂时,您大多不需要担心Evaluator。你通常可以“u”在那里,就像它是User的一个实例,因为它会将缺少的方法委托给它正在构建的实例。