在 gem 中扩展 Faker,我把 YAML 文件放在哪里?

Extending Faker in a gem, where do I put the YAML file?

我有一个 gem,它使用 Faker 来帮助构建模拟数据。我想添加一个新的 class 来生成新的东西类别,使用 Faker 本身使用的相同语法。前半部分很简单,我只需定义 class,并确保我的 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

好的,明白了。特别感谢 dax,他的评论为我指明了正确的方向。

Faker 使用 I18n gem 进行本地化(这就是 YAML 文件位于 'locales' 目录中的原因)。这意味着我需要将自定义 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。