Добавление ошибок кредитной карты в «ошибки» при использовании activemerchant

Я следил за railscast на activemerchant и получил этот код:

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/, но я их не читаю правильно или что-то.


person Ryan Florence    schedule 31.12.2009    source источник
comment
Вы когда-нибудь находили решение этой проблемы?   -  person DavidP6    schedule 11.10.2011


Ответы (2)


Добавление его в список ошибок и отображение этих ошибок позже — две разные вещи.

Первый способ, который у вас есть, выглядит правильно. Это помещает ошибку в список ошибок для этого объекта (например, могут быть другие ошибки проверки).

Затем вы можете использовать error_messages_for() (api ref), чтобы вывести эту ошибку в ваше представление. Это настраивается для того, что вы хотите назвать своими div.

Или вы можете сделать свой собственный вывод, перебирая @object.errors самостоятельно.

person wesgarrison    schedule 01.01.2010

У меня тоже была проблема с этим. Мое решение было двояким:

  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, где ошибки выводятся вместе с их полями, и добавляет дополнительную ошибку в базу, если по какой-то причине сопоставления не работай.

person Josh Kovach    schedule 21.05.2013