我在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.html和http://activemerchant.rubyforge.org/,但我没有正确阅读它们。
答案 0 :(得分:2)
将其添加到错误列表中并在以后显示错误是两回事。
你得到它的第一种方式看起来是正确的。这会将错误放入此对象的错误列表中(例如,可能存在其他验证错误。)
然后,您可以使用error_messages_for()
(api ref)在视图中输出该错误。它可以根据你想要调用你的div来定制。
或者,你可以自己循环遍历@ object.errors来自己做输出。
答案 1 :(得分:1)
我也有这个问题。我的解决方案有两个方面:
最终看起来像这样:
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,其中错误是通过字段输出的话,这会特别有用,如果出于某种原因,它会在基础上添加额外的错误。不工作。