ruby-on-rails - 看不懂Ruby的神奇

标签 ruby-on-rails ruby railscasts

在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/

相关文章:

ruby - 具有 block 局部参数的多个 Kernel#local_variables 条目

ruby-on-rails-3 - 带有回形针附件的 Rails 3 中的多步表单

html - Rails 5.1 CSS 背景图像 ID 未加载?

ruby - 用于简单数组操作的慢速 Ruby

ruby-on-rails - 我如何设置 'attr_accessible' 以不允许访问使用 Ruby on Rails 的模型的任何字段?

javascript - jquery-autocomplete 在 rails 中出错

ruby-on-rails - Nokogiri 段错误?

ruby-on-rails - Rails 4 Carrierwave + Minimagick : Failed to manipulate with MiniMagick, 也许它不是图像?原始错误:`mogrify -crop

ruby-on-rails - 在运行包更新时避免 RSA key 指纹

ruby-on-rails - Destroy_with_password 始终返回 false