meg*_*gas 5 ruby ruby-on-rails railscasts
在railscasts项目中,您可以看到以下代码:
before(:each) do
login_as Factory(:user, :admin => true)
end
Run Code Online (Sandbox Code Playgroud)
该函数的相应定义是:
Factory.define :user do |f|
f.sequence(:github_username) { |n| "foo#{n}" }
end
Run Code Online (Sandbox Code Playgroud)
我无法理解admin参数如何传递给函数,而在函数中没有关于admin参数的消息.谢谢
Factory.define它不是函数定义,它是一个采用符号或字符串(在本例中为用户)和定义您正在制作的工厂的块的方法. 使用admin属性Factory(:user, :admin => true)创建一个User对象.它没有调用你的第二个片段中的代码,它调用Factory()初始化工厂,并选择一个(在这种情况下是在第二个片段中定义的那个).然后它将散列形式的选项传递给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
Run Code Online (Sandbox Code Playgroud)
因此,Factory(name,options)等同于此代码中的Factory.new(name,options).
http://www.ruby-doc.org/core/classes/Kernel.html 注意数组和字符串等具有类似的结构.我想弄清楚他们现在是怎么做到的.
即使对于体面的Ruby程序员来说,这也令人困惑.我强烈推荐"Metaprogramming Ruby"这本书可能是我在ruby中读过的最好的书,它告诉你很多关于这些神奇的东西.
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |