3

在下面的示例中,我abbr只想成为的前 3 个字母,name但我得到一个 >> 未定义的局部变量name...我猜是因为name超出了 {} 块的范围?

Fabricator(:team) do
  name { Faker::Name.first_name }
  abbr { Faker::Name.first_name[0..2] }
  league { Fabricate(:league) }  
end

我怎样才能abbr只制作 的前三个字母name

即这会引发错误

Fabricator(:team) do
  name { Faker::Name.first_name }
  abbr { name[0..2] }  \\ error name is undefined here
  league { Fabricate(:league) }  
end
4

2 回答 2

6

您也可以通过接受 abbr 值块中的属性散列来做到这一点。

Fabricator(:team) do
  name { Faker::Name.first_name }
  abbr { |attrs| attrs[:name][0..2] }
  league
end

不相关,但如果你这样写,联赛会自动扩展到你上面指定的内容。

于 2015-03-02T00:28:54.430 回答
3

你应该能够做一个 before_save 回调......

Fabricator(:team) do
  before_save {|team| team.abbr ||= team.name[0..2] }
  name { Faker::Name.first_name }
  league { Fabricate(:league) }  
end

如果传递了 abbr 的值,则编辑为可选。

于 2015-03-01T18:56:13.373 回答