【问题标题】:How to pass in a block rather than a variable to a method in ruby that wants a variable如何将块而不是变量传递给需要变量的ruby方法
【发布时间】:2012-09-02 22:46:54
【问题描述】:

使用 Rails3,令人敬畏的 FactoryGirl gem 有一个方法 create_list,它接受一个策略,多次,然后将值的哈希值传递给策略。 (复制自https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md

twenty_year_olds = FactoryGirl.create_list(:user, 25, date_of_birth: 20.years.ago)

假设我不想传递“20.years.ago”,而是传递一个 lambda(或 Proc),每次读取变量时都会执行一次。这在 Ruby 或 FactoryGirl 中是否可行,或者 FactoryGirl 必须检查每个参数以查看它是否是 lambda。

dob_dynamic = -> { random_dob some_param }
twenty_year_olds = FactoryGirl.create_list(:user, 25, date_of_birth: dob_dynamic )

当我做这样的事情时,我得到了:

 raise ActiveRecord::AssociationTypeMismatch, message, Object expected, got Proc

我通过以下方式解决了这个问题:

  # pass i, b/c times always passes index to proc
  # dob_dynamic.() invokes dob_dynamic
  create_user = -> i { create :user, date_of_birth: dob_dynamic.() }
  25.times &create_user

有更好的方法吗?

【问题讨论】:

    标签: ruby-on-rails-3 factory-bot


    【解决方案1】:

    根据我对您的了解,您应该能够创建一个新工厂(可能使用工厂继承或特性)并将随机代码放入该工厂。如果您在工厂中使用块,每次都会重新评估它,因此您可以轻松使用 create_list。

    【讨论】:

      【解决方案2】:

      我发布了 create_list 的功能请求以支持获取 proc。暂时 after(:create) 的钩子非常适合这样的代码,如原始发布的那样:

      # pass i, b/c times always passes index to proc
      # dob_dynamic.() invokes dob_dynamic
      create_user = -> i { create :user, date_of_birth: dob_dynamic.() }
      25.times &create_user
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        相关资源
        最近更新 更多