1


0

Gems / PluginsからのRailsエラー(検証)メッセージのオーバーライド

Railsのgem / pluginからのエラー(検証)メッセージをオーバーライドする一般的に受け入れられている方法はありますか?

たとえば、ActiveMerchant gemを使用しています。AmericanExpressのクレジットカード番号を入力し、「MasterCard」を選択した場合、「説明が正しくありません_ "Type is not the card type"」というエラーが表示されます。

このようなことをすることで簡単に回避できます:

def validate_card
  unless credit_card.valid?
    credit_card.errors.full_messages.each do |message|
      if message =~ /is not the correct card type/i
        errors.add_to_base "This credit card number is invalid.
                            Please ensure that you selected the correct type."
      else
        errors.add_to_base message
      end
    end
  end
end

しかし、この手法はすぐに保守不能になり、明らかに(少なくとも私の意見では)「ベストプラクティス」とはほど遠いものです。

同様に、ActiveMerchant gemをアンパックして、独自のカスタムエラーメッセージを作成するためにハックすることもできますが、ActiveMerchantの将来のアンパックされたバージョンに同じハックを追加する必要があるため、維持することもできません。

1 Answer


1


正直なところ、あなたが最善の策は、あなたのニーズに合わせてgem / pluginの一部を書き換えることです。 残念ながら、いつでもgem / pluginを更新することにした場合、変更は失われます。

ただし、Rubyは動的言語であるため、クラスを再度開くことができ、任意のファイルから任意のモジュール/クラスのメソッドをオーバーライドできます。 オープンソースの魔法により、目標を達成するために調整する必要があるモジュール/クラス/メソッドを追跡しました。

以下をファイルに入れ、ActiveMerchantの後にロードされることを確認します(ロードする方法は、プラグインを使用するかgemを使用するかによって異なります)

module ActiveMerchant
  module Billing
    class CreditCard

      private
      def validate_card_number #:nodoc:
        errors.add_to_base "This credit card number is invalid. \n" +
         "Please ensure that you selected the correct type." unless
            CreditCard.valid_number?(number)
      end
    end
  end
end
  • N.B。:*このメソッドはActiveMerchant内部に依存しますが、これは一般に悪い考えです。 しかし、ActiveMerchantの独自のバージョンを維持することは、2つの悪の少ない方と考えています。 gem / pluginを更新し、上記のコードが依存する何かが変更された場合、奇妙な方法で壊れる可能性があります。