Rails:Model.human_attribute_name:字段应该在找不到翻译时引发错误?(也许是由state_machine引起的?)

Jos*_*eim 2 ruby-on-rails state-machine rails-i18n

我们经常在应用程序中偶然发现未翻译的模型属性.它们通常是因为某个属性被重命名或类似的东西而来.

Model.human_attribute_name :field找不到翻译时让I18n引发错误会非常有帮助.有没有办法实现这个目标?

更新:

似乎还有其他一些问题.这是我的I18n设置:

I18n.enforce_available_locales = false
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
config.i18n.default_locale = 'de-CH'
config.i18n.available_locales = ['de', 'de-CH', 'en']
config.i18n.locale = 'de-CH'
config.i18n.fallbacks = {'de-CH' => 'de', 'en-GB' => 'en'}
Run Code Online (Sandbox Code Playgroud)

我无法设置,fallbacks = false因为我想要缺少de-CH优雅委托的翻译de,这通常似乎工作正常.但对于我的状态机属性human_to_state方法,它似乎不起作用.这是导致问题的视图代码:

= f.input :state_event, collection: f.object.state_transitions,
                        label_method: :human_to_name # This causes the problem!
Run Code Online (Sandbox Code Playgroud)

这在视图中打印为"状态事件",当我添加以下I18n键时,它成功转换为"状态":

de:mongoid:attributes:activity:state_event:Status

所以真的一个漏译,但确实的I18n不以任何方式抱怨.我还尝试使用自定义异常处理程序捕获异常,但似乎没有引发:

I18n.exception_handler = lambda do |exception, locale, key, options|
  binding.pry # This is never reached!
end
Run Code Online (Sandbox Code Playgroud)

知道发生了什么事吗?这是状态机的问题吗?

Dan*_*nny 5

问题在于human_attribute_name回退到了

defaults << attribute.to_s.humanize
Run Code Online (Sandbox Code Playgroud)

什么都没找到.换句话说,human_attribute_name永远不会引发错误.

我通过覆盖human_attribute_name"修复"了这个,修补了上面提到的行:

(把它放在初始化器中)

require 'active_support/core_ext/hash/reverse_merge'

module ActiveModel
  module Translation
    include ActiveModel::Naming

    def human_attribute_name(attribute, options = {})
      defaults = lookup_ancestors.map do |klass|
        [:"#{self.i18n_scope}.attributes.#{klass.model_name.i18n_key}.#{attribute}",
         :"#{self.i18n_scope}.attributes.#{klass.model_name.i18n_key.to_s.tr('.', '/')}.#{attribute}"]
      end.flatten

      defaults << :"attributes.#{attribute}"
      defaults << options.delete(:default) if options[:default]
      defaults << attribute.to_s.humanize if Rails.env.production? # Monkey patch

      options.reverse_merge! :count => 1, :default => defaults
      I18n.translate(defaults.shift, options)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)