我刚刚更新到rails 4.0.2,收到以下警告:
[已弃用]I18n.enforce\u available\u区域设置将在将来默认为true。如果确实要跳过区域设置的验证,可以将I18n.enforce\u available\u locales=false设置为避免出现此消息
将其设置为false是否存在安全问题
重要信息:确保您的应用程序未使用I18n 0.6.8,因为它有一个错误,无法正确设置配置
简短回答
为了消除警告,请编辑application.rb文件,并在Rails::application正文中包含以下行
config.i18n.enforce\u available\u locales=true
可能的值为:
- 错误:如果
- 要跳过区域设置验证吗
- 不关心地区
- 正确:如果
- 如果传递了无效的区域设置,希望应用程序引发错误(或)
- 希望默认为新Rails行为(或)
- 关心区域设置验证吗
注:
- 旧的默认行为对应于
false,而不是true - 如果您正在设置
config.i18n.default\u locale配置或其他i18n设置,请确保在设置config.i18n.enforce\u available\u locales设置后执行此操作 - 如果您使用包含I18n功能的第三方gems,则通过应用程序
config对象设置变量可能没有效果。在这种情况下,使用I18n.config.enforce\u available\u locales将其直接设置为I18n。
警告
范例
需要文件。展开路径('../boot',文件)
# ...
模块You应用程序
班级申请<;Rails::应用程序
# ...
config.i18n.exforce\u available\u locales=true
#或者,如果您的一个gem竞争预加载,请使用
I18n.config.exforce\u available\u locales=true
# ...
终止
终止
长话短说
弃用警告现在显示在Rails 4(>=4.0.2)和Rails 3.2(>=3.2.14)中。原因在本文件中解释
强制使用可用的区域设置
当
I18n.config.exforce\u available\u locales为true时,我们将提出
I18n::如果传递的区域设置不可用,则出现InvalidLocale异常默认设置为
nil,将显示弃用错误如果设置为
false,我们将完全跳过强制使用可用的区域设置(旧行为)这已通过以下方法实现:
- I18n.config.default\u语言环境=
- I18n.config.locale=
- I18n.翻译
- I18n.本地化
- 音译
在此更改之前,如果您传递了一个不受支持的区域设置,Rails将在该区域设置有效时(即,如果/config/locales文件夹中有相应的区域设置文件)自动切换到该区域设置,否则该区域设置将默认为config.i18n.default\u locale配置(默认为:en)
i18ngem的新版本迫使开发人员更加注意区域设置管理
将来,行为将发生变化,如果区域设置无效,Rails应用程序将引发错误
在准备这类更改时(这可能会破坏到目前为止仍依赖于静默默认值的几个应用程序),警告将迫使您明确声明在当前过渡期内要执行的验证
要恢复以前的行为,只需将以下配置设置为false
config.i18n.exforce\u available\u locales=false
否则,将其设置为true以匹配新的Rails默认值,或者如果您希望更严格地进行域验证,并避免在区域设置无效的情况下切换到默认值
config.i18n.enforce\u available\u locales=true
警告
-
如果您正在设置
config.i18n.default\u locale配置或使用前面提到的任何方法(default\u locale=,locale=,translate等),请确保在设置config.i18n.exforce\u available\u locales设置后执行此操作。否则,弃用警告将继续弹出。(谢谢法比奥·巴蒂斯塔) -
如果使用包含I18n功能的第三方gem,则通过设置变量可能无效。事实上,问题与前一点中描述的相同,只是调试有点困难
这是一个优先事项。在Rails应用程序中设置配置时,该值不会立即分配给I18n gem。Rails将每个配置存储在一个内部对象中,加载依赖项(Railties和第三方gem),然后将配置传递给目标类。如果您使用gem(或Rails插件)在将配置分配给I18n之前调用任何I18n方法,那么您将得到警告
在这种情况下,您需要跳过Rails堆栈,并通过调用
I18n.config.exforce\u available\u locales=true而不是
config.i18n.enforce\u available\u locales=true这个问题很容易证明。尝试生成一个新的空Rails应用程序,您将看到
application.rb中的设置config.i18n如果在你的应用程序中没有,有一个简单的方法来调试罪犯。在系统中找到i18n gem,打开
i18n.rb文件并编辑方法exforce\u available\u locales以包含语句放置调用方。检查这将导致该方法在调用时打印stacktrace。您可以通过检查stacktrace(在我的例子中是Authlogic)来确定哪个gem正在调用它
[“/Users/weppos/.rvm/gems/[email protected]/gems/i18n-0.6.9/lib/i18n.rb:150:in“translate”, “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in'translate', “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in'translate', “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:在`验证`格式`电子邮件`字段`选项'中, “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:在“包含的块”中, “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in'class_eval', “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in'included', “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in'include', “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in'block in acts_as_authentic', “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:在'each'中, “/Users/weppos/.rvm/gems/[email protected]/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)>;”,