2014-12-30 5 views
0

Я пытаюсь проверить выкупные кодыНеопределенный метод delete_if для NilClass

@redemption_codes = Account.where(:redeemed == false).map(&:redemption_code) 

validates :code, inclusion: { in: @redemption_codes } 
before_create :remove_code 

def remove_code 
    @redeemed = Account.where(:redeemed == true).map(&:redemption_code) 
    @redemption_codes.delete_if{|code|@redeemed.include?(code)} 
end 

Если код уже погашен, я хочу, чтобы удалить его из массива, поэтому он больше не включается.

Здесь я получаю

Undefined method delete_if for nil:NilClass 

Значение @redemption_codes является nil

Если я ввожу значение, которое не входит в массив, я получаю флэш сообщение об ошибке.

Когда я печатаю значение, включенное в массив, оно работает. Другими словами, он работает, если я прокомментирую метод remove_code.

Проблема @redemption_codes установлена ​​в камне. Если значение обновлено с :redeemed = false до :redeemed = true, оно не исчезнет из массива.

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

Справка приветствуется.

+1

Код 'Account.where (: redeemed == false)' не имеет смысла. Синтаксис: 'Account.where (выкуплено: false)'. – ptd

+0

Или, 'Account.where (: redeemed => false)'. Похоже, это может быть синтаксический неверный текст или опечатка со стороны OP. – lurker

ответ

0

Это неправильный синтаксис.

Account.where(:redeemed == false) 

должен быть

Account.where(redeemed: false) 

Вы должны попробовать что-то вроде этого

def validate_code 
    @redemption_codes = Account.where(redeemed: false).map(&:redemption_code) 
    errors[:base] << "Invalid Redemption Code" unless @redemption_codes.include?(self.code) 
end 

Вы можете также использовать uniqueness валидатор

validates :code, inclusion: { in: @redemption_codes }, uniqueness: true 

Это гарантирует, что искупленной согл ount недействительно

Смежные вопросы