factory_girl traits的速记块语法

时间:2016-06-22 14:48:24

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

是否可以使用factory_girl特征的简写块语法?

考虑一下这家工厂:

FactoryGirl.define do
  factory :foo do
    name "name"

    # not using the block shorthand {} syntax, instead using do...end block syntax
    trait :my_name do
      name "Neil"
    end

  end
end

使用这个工厂:

create(:foo, traits: [:my_name])

但是我想使用简写块语法来表达我的特征:

FactoryGirl.define do
  factory :foo do
    name "name"

    # using shorthand block syntax but does not work
    trait :my_name {name "Neil"}

  end
end

现在使用这个工厂错误了。以下是发生的事情:

create(:foo, traits: [:my_name])
  

语法错误,意外' {',期待keyword_end(SyntaxError)

这看起来很奇怪,因为我认为无论你在哪里使用do ... end,都可以选择简写{}块语法。

问题:对于factory_girl trait方法,我的速记块语法是否有问题,这就是错误输出的原因?或者:您是否被允许使用factory_girl traits的速记块语法?有没有办法使用work_girl traits工作的速记块语法?

Docs on the factory_girl trait attribute

1 个答案:

答案 0 :(得分:2)

你看,trait实际上是一个采用特征和块名称的方法。这些是方法的2个参数。当您使用do ... end语法时,Ruby解释器可能会猜测您正在给出第二个(块)参数。但是,在第二个{ ... }案例中,目前尚不清楚,因为您可能正在传递Hash

这就是为什么你需要明确表示你正在传递第二个参数,这是一个像这样的块:

trait(:my_name) { name "Neil" }