【问题标题】:Rails: Getting Previously Defined Traits in a FactoryRails:在工厂中获取先前定义的特征
【发布时间】:2013-01-17 16:20:29
【问题描述】:

我有以下工厂:

FactoryGirl.define do
  factory :group_member do |f|
    f.user_id { rand(1..100) }
    f.group_id { rand(1..100) }
    f.membership { ["accepted", "invited", "declined", "requested", "denied", "left", "removed"].sample }
    if "#{membership}" == "accepted"
        f.host { [true, false].sample }
    else
        f.host false
    end

  end
end

行:

if "#{membership}" == "accepted"

正在抛出错误:

Trait not registered: membership

我的目的是查明先前定义的特征“成员资格”是否设置为“接受”。但是,我不确定如何访问该特征。有什么建议吗?

另一方面,工厂创建类似于表单创建,只要有一个变量(在本例中为“f”)分配了各种特征。有什么词可以描述这些类型的代码块吗?

更新:我已将工厂更改为使用 after_build 调用,但现在出现此错误:

undefined method `after_build=' for #<GroupMember:0x5dcb328>

更新后的代码如下:

FactoryGirl.define do
  factory :group_member do |f|
    f.user_id { rand(1..100) }
    f.group_id { rand(1..100) }
    f.membership { ["accepted", "invited", "declined", "requested", "denied", "left", "removed"].sample }
    f.after_build do |obj|   
        if obj.membership == "accepted"
            obj.host = [true, false].sample
        else
            obj.host = false
        end 
    end

  end
end

【问题讨论】:

  • 你试过"#{f.membership}"吗?或者,事实上,只是if f.membership == "accepted"
  • 刚刚运行它并得到了同样的错误。
  • 还运行了 'if f.membership == "accepted"',并引发语法错误。
  • 很公平,主要只是一个平底船。
  • 不用担心。感谢您试一试!

标签: ruby-on-rails factories


【解决方案1】:

回复:检查已设置的值。

f.after_build do |obj|   
  # Test your obj.membership here. 
end

回复:抱怨after_build不存在的错误信息。

你的定义语法看起来不对劲。改变这个:

FactoryGirl.define do
  factory :group_member do |f|

到这里:

FactoryGirl.define :group_member do |f|

【讨论】:

  • 我现在收到与 after_build 相关的错误。您介意阅读我上面的更新吗?
  • 您使用的是哪个版本的 FactoryGirl?回调不是最前沿的,但它们一开始也不存在。
  • 我在master上,4.1.0。我将检查文档以查看回调是否已更改。
  • 看起来 FactoryGirl 的语法发生了变化。现在应该是“f.after(:build) do |obj|”。这种方法适用于我的原始语法和您刚刚推荐的更简洁的语法。
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多