【问题标题】:Rails I18n validation deprecation warningRails I18n 验证弃用警告
【发布时间】:2013-12-20 02:48:11
【问题描述】:

我刚刚更新到 rails 4.0.2,我收到了这个警告:

[deprecated] I18n.enforce_available_locales 在未来将默认为 true。如果您真的想跳过对您的语言环境的验证,您可以设置 I18n.enforce_available_locales = false 以避免出现此消息。

将其设置为 false 是否存在任何安全问题?

【问题讨论】:

  • 显然Rails 4.0.1 应用程序也会发生这种情况。
  • 我在 Rails 3.2.16 上也有同样的情况。根据 Simone Carletti 下面的回答,它在 Rails 4 (>= 4.0.2) 和 Rails 3.2 (>= 3.2.14) 中。

标签: ruby-on-rails ruby ruby-on-rails-4 deprecated rails-i18n


【解决方案1】:

如果您想关心语言环境,请写入appilcation.rb 文件。

config.i18n.enforce_available_locales = true

如果区域设置验证,你可以写 false 并且不关心。

【讨论】:

    【解决方案2】:

    重要提示:确保您的应用未使用 I18n 0.6.8,它有一个 bug that prevents the configuration to be set correctly


    简答

    为了消除警告,请编辑 application.rb 文件并在 Rails::Application 正文中包含以下行

    config.i18n.enforce_available_locales = true
    

    可能的值是:

    • false:如果你
      • 想要跳过区域设置验证
      • 不关心语言环境
    • :如果你
      • 希望应用程序在传递(或)无效的语言环境时引发错误
      • 想要默认使用新的 Rails 行为(或)
      • 关心区域设置验证

    注意:

    • 旧的默认行为对应于false,而不是true
    • 如果您正在设置config.i18n.default_locale 配置或其他i18n 设置,请确保在设置config.i18n.enforce_available_locales 设置后进行。
    • 如果您使用包含 I18n 功能的第三方 gem,通过 Application config 对象设置变量可能没有效果。在这种情况下,使用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) 中都会显示弃用警告。原因在this commit中有解释。

    强制使用可用的语言环境

    I18n.config.enforce_available_locales 为真时,我们将提出一个 如果传递的语言环境不可用,则 I18n::InvalidLocale 异常。

    默认设置为nil,这将显示弃用错误。

    如果设置为 false,我们将完全跳过强制可用的语言环境(旧行为)。

    这已通过以下方法实现:

    • I18n.config.default_locale=
    • I18n.config.locale=
    • I18n.translate
    • I18n.localize
    • I18n.transliterate

    在此更改之前,如果您传递了一个不受支持的语言环境,如果该语言环境有效(即如果在 /config/locales 文件夹中存在相应的语言环境文件),Rails 将静默切换到该语言环境,否则该语言环境将默认为 @ 987654339@ 配置(默认为 :en)。

    新版本的 I18n gem 迫使开发人员更加注意语言环境管理。

    将来,行为会发生变化,如果语言环境无效,Rails 应用程序将引发错误。

    在准备此类更改(这可能会破坏直到今天还依赖静默默认设置的多个应用程序)时,警告会强制您在当前过渡期间明确声明要执行的验证。

    要恢复以前的行为,只需将以下配置设置为false

    config.i18n.enforce_available_locales = false
    

    否则,将其设置为 true 以匹配新的 Rails 默认值,或者如果您希望在域验证上更加严格,并避免在区域设置无效的情况下切换到默认值。

    config.i18n.enforce_available_locales = true
    

    警告

    1. 如果您正在设置 config.i18n.default_locale 配置或使用前面提到的任何方法(default_locale=locale=translate 等),请确保在设置 config.i18n.enforce_available_locales环境。否则,弃用警告将不断弹出。 (感谢Fábio Batista)。

    2. 如果您使用包含 I18n 功能的第三方 gem,则通过设置变量可能无效。实际上,问题与上一点描述的相同,只是调试起来有点困难。

      这个问题是优先事项。当您在 Rails 应用程序中设置配置时,该值不会立即分配给 I18n gem。 Rails 将每个配置存储在一个内部对象中,加载依赖项(Railties 和第三方 gem),然后将配置传递给目标类。如果您在将配置分配给 I18n 之前使用调用任何 I18n 方法的 gem(或 Rails 插件),那么您将收到警告。

      在这种情况下,您需要跳过 Rails 堆栈并通过调用立即将配置设置为 I18n gem

      I18n.config.enforce_available_locales = true
      

      而不是

      config.i18n.enforce_available_locales = true
      

      这个问题很容易证明。尝试生成一个新的空 Rails 应用程序,您会发现在 application.rb 中设置 config.i18n 可以正常工作。

      如果在您的应用中没有,有一种简单的方法可以调试罪魁祸首。在系统中找到 i18n gem,打开 i18n.rb 文件并编辑方法 enforce_available_locales! 以包含语句 puts caller.inspect

      这将导致该方法在调用时打印堆栈跟踪。您将能够通过检查堆栈跟踪(在我的例子中是 Authlogic)来确定哪个 gem 正在调用它。

      ["/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.i18n.default_locale 配置,请确保在设置新的config.i18n.enforce_available_locales 设置之后 执行此操作。否则,弃用警告将不断弹出。
    • 对我来说,只有当我设置I18n.enforce_available_locales = true 时才有效。 config.i18n.enforce_available_locales = true 不工作。
    • @Pioz 这可能是由您的应用程序所依赖的 gem 引起的。我更新了帖子以解释原因。
    • @SimoneCarletti 直接呼叫应该是 I18n.config.enforce_available_locales 而不是 I18n.config.i18n.enforce_available_locales,我已经编辑了您的答案。感谢修复。
    • 需要说明的是,例如必须设置I18n.config.available_locales = [:your_locale, :en],否则你将无法启动你的rails服务器。
    【解决方案3】:

    I18n.config.enforce_available_locales = true 在 Rails 3.2.16 中为我工作(我把它放在 config/application.rb 中)

    【讨论】:

      【解决方案4】:

      为了完整起见,请注意,您还可以通过在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
      

      【讨论】:

      • config.i18n.enforce_available_locales = true 不是更整洁吗?
      • 我在 3.2.16,我设置为 I18n.enforce_available_locales = false ,但我仍然有消息...
      • @Mischa 对我不起作用,但上面的答案确实有效。
      • @Mischa 很遗憾没有,必须通过 I18n.config 才能生效
      • config.i18n.enforce_available_locales = true in config/application.rb 消除了 Rails 4.0.2 中的弃用警告,但前提是我将它放在其他 config.i18n 行之上。
      【解决方案5】:

      似乎不是这样 - 那是 i18n 工作方式以前的行为 - 当您要求一个未实现/不可用的语言环境时,新行为 (true) 会引发错误。

      查看添加此警告的提交:https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

      【讨论】:

        猜你喜欢
        • 2013-12-27
        • 2014-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多