Проверка не пройдена, потому что проверка наличия не соблюдается рельсы 5 - PullRequest
0 голосов
/ 01 марта 2019

Моя Transaction модель принадлежит_2 UserWallet (sender_wallet, receiver_wallet) экземплярам.И я проверяю наличие этих двух экземпляров, среди прочих атрибутов currency, amount... При создании, я также удостоверяюсь, что у sender_wallet достаточно денег для создания этой транзакции

class Transaction < ApplicationRecord
  belongs_to :sender_wallet, class_name: 'UserWallet'
  belongs_to :receiver_wallet, class_name: 'UserWallet'

  validates :sender_wallet, :receiver_wallet, :amount, :currency, presence: true

  validate :validate_balance, on: :create

  def validate_balance
    if sender_wallet.balance < amount
      errors.add(:amount, 'Not enough money')
    end
  end
end

Проблема заключается в том, что при использованииbelong_to shoulda-matcher для sender_wallet, он устанавливает sender_wallet в nil и вызывает validate_balance, который выбрасывает

NoMethodError: undefined method `balance' for nil:NilClass

Разве это не должно произойти, потому что sender_wallet не установлен?Я пытался закопаться в нее с помощью консоли, и когда я делаю

Transaction.create(amount: 10000, currency: 'EUR')

, она тоже не получается

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 01 марта 2019

Все проверки будут отменены один за другим.Итак, согласно вашему коду, сначала он будет проверять наличие, затем validate_balance.

Теперь, при проверке validate_balance, у вас есть значение sender_wallet nil, вызывающее эту ошибку.

Проверка лучшей опции для sender_walletприсутствие перед методом validate_balance тремя способами:

  1. в вашем коде проверки

    validate :validate_balance, on: :create, if: -> { sender_wallet_id.present? }
    
  2. в вашем методе validate_balance

    def validate_balance
      if sender_wallet.present? && sender_wallet.balance < amount
         errors.add(:amount, 'Not enough money')
      end
    end
    
  3. используйте try (: attribute), исключение не будет генерироваться.

    def validate_balance   
      if sender_wallet.try(:balance) < amount
        errors.add(:amount, 'Not enough money') 
      end 
    end
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...