Rails 5-Umlaute和参数化方法的问题

问题描述 投票:1回答:1

我使用Rails 5.2.3和Ruby 2.2.1。在某个时候,当我期望我的字符串数组常量包含一些字符串但没有发现问题时,我发现了一个问题。原来,问题与德国Umlaute字符(öäü)有关。

所以我有如下定义的常量:

# coding: utf-8
# frozen_string_literal: true
class MyClass
  module MyModule
    MY_CONSTANT = [
      'Breite in mm',
      'Höhe in mm',
      'Länge in mm'
    ].map(&:parameterize).freeze
  end
end

我希望常量看起来像["breite-in-mm", "hoehe-in-mm", "laenge-in-mm"]

但是它存储为["breite-in-mm", "hohe-in-mm", "lange-in-mm"]。您会看到,“ö”已转换为“ o”而不是“ oe”。与“ä”相同。现在是“ a”,而不是“ ae”。

即使在我启动Rails控制台并调用此常量时,也可以在生产中,RSpec测试中以这种方式工作。但是,当我使用完全相同的代码从Rails控制台定义新常量时,字符串已成功转换为我期望的字符串,即["breite-in-mm", "hoehe-in-mm", "laenge-in-mm"]

我可以轻松摆脱这种parameterize方法,只需要输入字符串即可。也许我必须这样做。但是我真的很好奇为什么所有这些事情都在发生,而我自己却找不到答案。

因此,谢谢您的任何想法。

ruby-on-rails ruby ruby-on-rails-5
1个回答
0
投票

Rails中的parameterize方法(通过使用ActiveSupport::Inflector#transliterate)在语言环境中。因此,它使用依赖于语言环境的规则将诸如Umlauts的字符音译为ASCII字符。

[当您的应用处理请求时(或引导后至少处理一次),通常会设置一个I18n语言环境,例如用ActiveSupport::Inflector#transliterate。之后,Rails(代表i18n gem)默认使用该语言环境作为音译规则。

最初设置常数时,可能尚未设置此默认语言环境。因此,i18n宝石不知道德国的音译规则。

作为一种解决方法,您可以将所需的语言环境作为参数传递给参数化方法

I18n.locale = :de

或者您也可以在执行代码之前设置默认的i18n语言环境(例如,在MY_CONSTANT = [ 'Breite in mm', 'Höhe in mm', 'Länge in mm' ].map { |const| const.parameterize(locale: :de).freeze } 中的文件中,具体取决于初始化常量的位置):

config/initializers
© www.soinside.com 2019 - 2024. All rights reserved.