2010-01-11 50 views
1

是否有一種通用的方式來覆蓋來自rails中gem/plugin的錯誤(驗證)消息?重寫Rails錯誤(驗證)來自Gems /插件的消息

例如,我使用的是ActiveMerchant Gem,如果某人輸入美國運通信用卡號碼,但選擇「MasterCard」,我會得到一個不太具有描述性的「類型不是正確的卡片類型「錯誤。

我可以很容易地解決這個獲得通過做這樣的事情:

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

誠實地說,最好的辦法是重寫gem/plugin的部分內容以滿足您的需求。不幸的是,如果你決定隨時更新gem/plugin,你將會失去你的改變。

但是,Ruby是一種動態語言,因此可以重新打開類,並且可以從任何文件覆蓋任何模塊/類的方法。通過開放源代碼的魔力,我追蹤了你需要干預以實現目標的模塊/類/方法。

將下面的文件,並確保它得到ActiveMerchant後加載(如何加載它依賴於你是否正在使用的插件或寶石)

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 

注:這種方法依賴在ActiveMerchant內部,這通常是一個壞主意。但我認爲它是維護自己版本的ActiveMerchant的兩個弊端中的一個。如果你更新gem/plugin和上面的代碼依賴的東西已經改變,它可能會以奇怪的方式打破。

+0

謝謝,我曾想過做這樣的事情,但不確定'validate_card_number'是否是私人的事實會導致任何問題。 – jerhinesmith 2010-01-11 18:36:27