1

我遵循了 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

但这并没有将字段包装在fieldWithErrorsdiv 中。所以我尝试了:

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/但我没有正确阅读它们。

4

2 回答 2

2

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

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

然后,您可以使用error_messages_for()( api ref ) 在您的视图中输出该错误。无论你想调用你的 div,它都是可定制的。

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

于 2010-01-01T05:17:27.877 回答
2

我也有这个问题。我的解决方案是双重的:

  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 之类的 gem,其中错误与它们的字段一起输出,这将特别有用,并且它会在基础上添加额外的错误,以防由于某种原因映射不工作。

于 2013-05-21T16:41:04.243 回答