Rails I18nvalidation弃用警告
我只是更新到轨道4.0.2,我得到这个警告:
[已弃用] I18n.enforce_available_locales将来默认为true。 如果您确实要跳过validation语言环境,则可以将I18n.enforce_available_locales = false设置为避免此消息。
是否有任何安全问题设置为false?
重要提示 :确保您的应用程序不使用I18n 0.6.8,它有一个错误,防止configuration正确设置 。
简短的回答
为了消除警告,编辑application.rb文件并在Rails::Application
主体中包含以下行
config.i18n.enforce_available_locales = true
可能的值是:
- 假 :如果你
- 想跳过区域validation
- 不关心区域设置
- 真的 :如果你
- 如果一个无效的区域设置被传递(或),应用程序会引发错误
- 想要默认使用新的Rails行为(或)
- 关心区域validation
注意:
- 旧的默认行为对应于
false
,不true
。 - 如果您正在设置
config.i18n.default_locale
configuration或其他i18n设置,请确保在设置config.i18n.enforce_available_locales
设置后执行此设置。 - 如果您使用包含I18nfunction的第三方gem,通过应用程序
config
对象设置variables可能没有效果。 在这种情况下,请使用I18n.config.enforce_available_locales
将其直接设置为I18n
。
注意事项
例
require File.expand_path('../boot', __FILE__) # ... module YouApplication class Application < Rails::Application # ... config.i18n.enforce_available_locales = true # or if one of your gem compete for pre-loading, use I18n.config.enforce_available_locales = true # ... end end
长答案
弃用警告现在都在Rails 4(> = 4.0.2)和Rails 3.2(> = 3.2.14)中显示。 原因在这个提交中解释。
强化可用的区域设置
当
I18n.config.enforce_available_locales
为true时,如果传递的语言环境不可用,则会引发I18n :: InvalidLocaleexception。默认设置
nil
,这将显示一个弃用错误。如果设置为
false
我们将跳过执行可用的语言环境(旧行为)。这已通过以下方法实施:
- I18n.config.default_locale =
- I18n.config.locale =
- I18n.translate
- I18n.localize
- I18n.transliterate
在这个改变之前,如果你传递了一个不支持的语言环境,如果语言环境有效的话(例如/config/locales
文件夹中有一个对应的语言/config/locales
文件),Rails会默默地切换到它,否则语言环境默认为config.i18n.default_locale
configuration(默认为:en)。
I18n gem的新版本迫使开发人员对地区pipe理有一点点的意识。
将来,行为会改变,如果一个语言环境是无效的,Rails应用程序将会引发错误。
在准备这种改变时(这可能会破坏几个应用程序,直到今天依靠默认的默认设置),警告迫使您在当前过渡期间明确声明您要执行的validation。
要恢复以前的行为,只需将以下configuration设置为false
config.i18n.enforce_available_locales = false
否则,将其设置为true以匹配新的Rails默认值,或者如果您希望对域validation更加严格,并避免在语言环境无效的情况下切换到默认值。
config.i18n.enforce_available_locales = true
警告
-
如果您正在设置
config.i18n.default_locale
configuration或者使用前面提到的方法(default_locale=
,locale=
,translate
等),请确保在设置config.i18n.enforce_available_locales
设置后执行此操作。 否则,弃用警告将继续popup。 (感谢FábioBatista )。 -
如果您使用包含I18nfunction的第三方gem,则通过设置variables可能无效。 实际上,这个问题和前面说的一样,只是有点难以debugging。
这个问题是一个优先事项。 当您在Rails应用程序中设置configuration时,该值不会立即分配给I18n gem。 Rails将每个configuration存储在内部对象中,加载依赖关系(Railties和第三方gem),然后将configuration传递给目标类。 如果你使用gem(或Rails插件),在configuration被分配给I18n之前调用任何I18n方法,那么你会得到警告。
在这种情况下,您需要跳过Rails堆栈并通过调用立即将configuration设置为I18n gem
I18n.config.enforce_available_locales = true
代替
config.i18n.enforce_available_locales = true
这个问题很容易certificate。 尝试生成一个新的空的Rails应用程序,你会发现在
application.rb
中设置config.i18n
工作正常。如果在你的应用程序中没有,那么有一个简单的方法来debugging罪魁祸首。 在系统中findi18n gem,打开
i18n.rb
文件并编辑方法enforce_available_locales!
包括声明puts caller.inspect
。这将导致该方法在调用时打印堆栈跟踪。 您将能够通过检查堆栈跟踪来确定哪个gem正在调用它(在我的情况下是Authlogic)。
["/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/i18n-0.6.9/lib/i18n.rb:150:in `translate'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in `translate'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in `translate'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:in `validates_format_of_email_field_options'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in `block in included'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `class_eval'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `included'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `include'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `block in acts_as_authentic'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `each'", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `acts_as_authentic'", "/Users/weppos/Projects/application/app/models/user.rb:8:in `<class:User>'", "/Users/weppos/Projects/application/app/models/user.rb:1:in `<top (required)>'",
为了完整性,请注意,您还可以通过在config/application.rb
I18n.enforce_available_locales
设置为true
(或false
)来摆脱警告:
require File.expand_path('../boot', __FILE__) . . . module SampleApp class Application < Rails::Application . . . I18n.enforce_available_locales = true . . . end end
I18n.config.enforce_available_locales = true
在Rails 3.2.16中为我工作(我把它放在config / application.rb中)
似乎并不是这样 – 这将是以前的行为方式国际化的作品 – 新行为(真)会提出一个错误,当你要求一个地区不实施/可用。
看到添加此警告的提交: https : //github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c