2014-01-07 5 views
2

우리는 종종 응용 프로그램에서 변환되지 않은 모델 속성을 비틀 거리게됩니다. 애트리뷰트의 이름이 변경되었거나 이와 같이 변경되기 때문에 가장 자주 발생합니다.레일 : Model.human_attribute_name : 번역을 찾을 수 없을 때 필드에서 오류가 발생해야합니까? (아마도 state_machine에 의한 것일 수도 있습니다.)

Model.human_attribute_name :field이 번역을 찾지 못하면 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'} 

내가 정상적으로 일반적으로 잘 작동하는 것 같다있는 de에 위임 할 de-CH의 실종 번역을 원하기 때문에 내가 fallbacks = false을 설정할 수 없습니다. 하지만 내 state machine 속성 human_to_state 메서드는 작동하지 않는 것 같습니다.

= f.input :state_event, collection: f.object.state_transitions, 
         label_method: :human_to_name # This causes the problem! 

이 뷰에서 "주 이벤트"로 인쇄하고, 나는 다음과 같은 국제화 키를 추가 할 때, 그것은 "상태"를 성공적으로 번역 된 것 :

드 여기에 문제를 일으키는 뷰 코드는 : mongoid : 속성 : 활동 state_event : 그래서 거기에

상태

정말 이 누락 된 번역이지만, 국제화 어떤 방법으로 불평하지 않습니다. 또한 사용자 정의 예외 처리기를 사용하여 예외를 잡으려고 시도했지만이 발생하지 않는 것 :

I18n.exception_handler = lambda do |exception, locale, key, options| 
    binding.pry # This is never reached! 
end 

어떤 생각이 무슨 일이야? 상태 머신에 문제가 있습니까? 의

+0

호 :

는 I 상술 라인 패칭 human_attribute_name 재정 의하여이 "고정"HTTPS : //github.com/rails/rails/issues/6489 – Markus

답변

0

가능한 중복 : How to enable Rails I18n translation errors in views?

허용 대답은 다음과 같습니다

config.i18n.fallbacks = false 

@BettySt의 대답은 꽤 멋지다, 당신이 그녀의 솔루션을 살펴해야한다. 국제화 번역 오류를 처리하는 방법에 대한

문서는 : 아무것도 다른 발견 할 때 human_attribute_name이

defaults << attribute.to_s.humanize 

로 다시 떨어질 것으로 http://guides.rubyonrails.org/i18n.html#using-different-exception-handlers

+0

저를 가리켜 주셔서 감사합니다. 처음에는 찾지 못했습니다. –

+0

제공된 정보로 해결할 수 없기 때문에 더 궁금합니다. –

5

문제는 사실에있다. 즉, 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