我有一个使用Faker帮助构建模拟数据的gem。我想添加一个新类,它使用Faker自己使用的相同语法生成一个新类别的东西。前半部分很简单,我只需定义类,并确保我的gem加载文件:
# lib/faker/restaurant.rb
module Faker
class Restaurant < Base
class << self
def name
parse('restaurant.name')
end
end
end
end
到目前为止,这么好。现在,为了描述可以从中得到什么值,我创建了一个YAML文件:
faker:
en:
restaurant:
suffix: [Cafe,Restaurant]
name:
- "#{Name.first_name}'s #{suffix}"
所以,实际的问题是:这个文件在哪里,它应该有什么名称?如果这是一个Rails应用程序,它将是config/locales/faker.en.yml
。在一个gem中,这似乎不起作用 - 实际上并没有'config'目录,但是为此目的创建它并没有帮助,我得到:
> Faker::Restaurant.name
I18n::MissingTranslationData: translation missing: en.faker.restaurant.name
答案 0 :(得分:2)
好的,想通了。特别感谢 dax ,他的评论使我朝着正确的方向前进。
Faker使用I18n gem进行本地化(这就是为什么YAML文件位于&#39; locales&#39;目录中)。这意味着我需要将自定义YAML添加到I18n加载路径。只要文件被添加到加载路径中,文件的确切位置并不重要。就我而言,我把它放在lib/faker/locales/en-US.yml
,并将整个目录添加到加载路径,因此:
<强> LIB / my_gem.rb:强>
I18n.load_path += Dir[File.join(File.expand_path(File.dirname(__FILE__)), 'faker/locales', '*.yml')]
require "faker/restaurant"
我放入该目录的任何.yml
文件都应加载并供Faker使用。
附注:我还需要稍微改变YAML格式 - 它应该是
en:
faker:
<stuff>
而不是顶级的faker,就像我拥有它一样。