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

时间:2009-12-31 21:36:37

标签: ruby-on-rails activemerchant

我在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 div中。所以我试过了:

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.htmlhttp://activemerchant.rubyforge.org/,但我没有正确阅读它们。

2 个答案:

答案 0 :(得分:2)

将其添加到错误列表中并在以后显示错误是两回事。

你得到它的第一种方式看起来是正确的。这会将错误放入此对象的错误列表中(例如,可能存在其他验证错误。)

然后,您可以使用error_messages_for()api ref)在视图中输出该错误。它可以根据你想要调用你的div来定制。

或者,你可以自己循环遍历@ object.errors来自己做输出。

答案 1 :(得分:1)

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

  1. 在基础
  2. 中添加一般“信用卡无效”错误
  3. 将每个信用卡错误映射到我自己的模型的属性。
  4. 最终看起来像这样:

    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,其中错误是通过字段输出的话,这会特别有用,如果出于某种原因,它会在基础上添加额外的错误。不工作。