我的Company
模式下有一个数据库字段,用于指定公司的区域设置。我想验证它的值是否包含在I18n
的可用语言环境中,并且我发现Rails的包含验证适合此任务。
但是当我使用
时class Company < ActiveRecord::Base
validates :locale, inclusion: { in: I18n.available_locales.map { |l| l.to_s } }
end
(map
调用是因为I18n.available_locales
返回一个符号数组,而不是字符串,所以我们需要在这里转换它们。
当我从Rails控制台调用de
时可用的语言环境I18n.available_locales
无效。我该怎么办?
答案 0 :(得分:2)
这里的问题是I18n.available_locales
在加载Company
类时被评估一次。显然,当时并非所有语言环境都可用。您需要做的是动态调用available_locales
,然后使用 proc 执行此操作:
validates :locale, inclusion: { in: proc { I18n.available_locales.map { |l| l.to_s } }
这将在运行时进行评估,您的所有语言环境都将可用。