在railscasts项目中你可以看到这段代码:
before(:each) do
login_as Factory(:user, :admin => true)
end
函数对应的定义是:
Factory.define :user do |f|
f.sequence(:github_username) { |n| "foo#{n}" }
end
我不明白 admin 参数是如何传递给函数的,而函数中没有关于 admin 参数的字样。谢谢
最佳答案
Factory.define
不是一个函数定义,它是一个方法,它接受一个符号或字符串(在本例中是用户)和一个定义你正在制作的工厂的 block 。 Factory(:user, :admin => true)
创建一个具有 admin 属性的 User
对象。它不是调用第二个片段中的代码,而是调用 Factory()
来初始化一个工厂,并选择一个(在本例中是第二个片段中定义的那个)。然后它也将散列形式的选项传递给工厂。
Factory
选择非常通用的 :user
工厂。选项 :admin=>true
只是告诉 Factory
将 User 上的 admin 实例变量设置为 true。
This is actually what it is calling in factory.rb in factory girl
def initialize(name, options = {}) #:nodoc:
assert_valid_options(options)
@name = factory_name_for(name)
@options = options
@attributes = []
end
因此 Factory(name,options) 在这段代码中等同于 Factory.new(name,options)。
http://www.ruby-doc.org/core/classes/Kernel.html注意 Array 和 String 等具有相似的结构。我现在想弄清楚他们是怎么做到的。
即使对于体面的 Ruby 程序员来说,这也令人困惑。我强烈推荐《Metaprogramming Ruby》这本书,它可能是我读过的关于 ruby 的最好的书,它告诉你很多关于这个神奇的东西。
关于ruby-on-rails - 看不懂Ruby的神奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5025027/