在 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。
我有一个 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。