代码之家  ›  专栏  ›  技术社区  ›  Ryan Florence

使用ActiveMerchant时将信用卡错误添加到“错误”

  •  1
  • Ryan Florence  · 技术社区  · 14 年前

    我跟踪了activemerchant上的railscast,得到了以下代码:

    def validate_card
      unless credit_card.valid?
        credit_card.errors.full_messages.each do |message|
          errors.add_to_base message
        end
      end
    end
    

    但这并不能把整个领域 fieldWithErrors 所以我试着:

    def validate_card
      unless credit_card.valid?
        credit_card.errors.each do |error|
          errors.add error
        end
      end
    end
    

    但还是不行。我读过 http://api.rubyonrails.org/classes/ActiveResource/Errors.html http://activemerchant.rubyforge.org/ 但我读得不对。

    2 回复  |  直到 11 年前
        1
  •  2
  •   wesgarrison    14 年前

    将它添加到错误列表并在稍后显示错误是两件不同的事情。

    第一种方法看起来是对的。将错误放入此对象的错误列表中(例如,可能还有其他验证错误)。

    那么,你可以使用 error_messages_for() ( api ref )在视图中输出该错误。它是可定制的任何你想叫你的div。

    或者,您可以通过循环@object.errors来完成自己的输出。

        2
  •  1
  •   Josh Kovach csi    11 年前

    我也有这个问题。我的解决方案有两个:

    1. 将常规“信用卡无效”错误添加到基
    2. 将每个信用卡错误映射到我自己模型的属性。

    结果看起来像这样:

    def valid_credit_card
      unless credit_card.valid?
        errors.add(:base, 'Credit card is invalid') # optional
        credit_card.errors.each do |attr, messages|
          # Map to the model properties, assuming you used the 
          # setup from the Railscast
          if attr =~ /month|year/
            attr = 'card_expires_on'
          elsif attr =~ /(first|last)_name/
            # attr = attr
          else
            attr = "card_#{attr}".gsub(/_value/, '')
          end
          messages.each { |m| errors.add(attr, m) unless errors[attr].include?(m) }
        end
      end
    end
    

    这会将错误放在适当的属性上,如果您使用simple_form或formtastic之类的gems(其中错误与它们的字段一起输出),这会特别有帮助,并且它会在base上添加额外的错误,以防由于某些原因映射不起作用。