NilClass的未定义方法delete_if

时间:2014-12-30 15:55:33

标签: ruby-on-rails ruby arrays validation null

我试图验证兑换码

@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

如果我输入一个未包含在数组中的值,我会收到一条错误的flash消息。

当我输入数组中包含的值时,它可以正常工作。换句话说,如果我注释掉remove_code方法,它就会起作用。

问题是@redemption_codes一成不变。如果值从:redeemed = false更新为:redeemed = true,则不会从数组中消失。

这就是为什么我尝试创建自定义验证邮件的原因,但它没有用。

非常感谢帮助。

1 个答案:

答案 0 :(得分: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

这可确保兑换的帐户无效