【问题标题】:Adding credit card errors to `errors` when using activemerchant使用 activemerchant 时将信用卡错误添加到“错误”中
【发布时间】:2010-12-31 12:38:48
【问题描述】:

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

【问题讨论】:

  • 你找到解决方案了吗?

标签: ruby-on-rails activemerchant


【解决方案1】:

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

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

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

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

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 2013-03-08
      • 2011-01-29
      • 2011-07-18
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2016-01-27
      • 2016-06-27
      相关资源
      最近更新 更多