7

ビューで次のコードを検討してください。

<%= link_to 'Delete!', item ,  :confirm => t('action.item.confirm_deletion'), :method => :delete %>

通常は次のようになります。

<a href="/items/123" data-confirm="Confirm deletion?" data-method="delete" rel="nofollow">Delete!</a>

しかし、action.item.confirm_deletionの翻訳が何らかの理由 (不完全な yml ファイル、タイプミスなど) で欠落している場合、次のようになります。

<a href="/items/123" data-confirm="<span class="translation_missing" title="translation missing: sv.action.item.confirm_deletion">Confirm Deletion</span>" data-method="delete" rel="nofollow">Delete!</a>

これは無効な html であり、ユーザーはホームページに壊れた html タグが表示されます。場合によっては、セキュリティ上のリスクになることもあります。

I18n.t 関数を呼び出すたびにエスケープを適用できることはわかっていますが、それはタスクにとって不必要に繰り返されるように感じます。

私の質問は次のとおりです。「翻訳がありません」というメッセージに HTML コードが含まれないようにする方法はありますか。

4

2 に答える 2

4

複数のソリューションがあります。

翻訳メソッドを独自のものにエイリアスし、カスタム:default値で呼び出すことができます (私はこの方法をお勧めします):

module ActionView
  module Helpers
    module TranslationHelper
      alias_method :translate_without_default :translate

      def translate(key, options = {})
        options.merge!(:default => "translation missing: #{key}") unless options.key?(:default)
        translate_without_default(key, options)
      end
    end
  end
end

または、デフォルト値を上書きできます。

module I18n
  class MissingTranslation
    def html_message
      "translation missing: #{keys.join('.')}"
    end
  end
end
于 2012-08-07T11:29:28.080 に答える
1

Rails 4.2translateでは、ビューでヘルパーを再定義する必要があります。

https://github.com/rails/rails/blob/v4.2.5/actionview/lib/action_view/helpers/translation_helper.rb#L78

Rails 5 では、application.rb で次のように設定できます。

config.action_view.debug_missing_translation = false
于 2015-12-29T14:57:55.403 に答える