【问题标题】:Undefined method delete_if for NilClassNilClass 的未定义方法 delete_if
【发布时间】:2015-02-26 19:09:38
【问题描述】:

我正在尝试验证兑换码

@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,它不会从数组中消失。

这就是为什么我尝试创建自定义验证消息,但没有成功。

感谢您的帮助。

【问题讨论】:

  • 代码Account.where(:redeemed == false) 没有意义。语法为Account.where(redeemed: false)
  • 或者,Account.where(:redeemed => false)。看起来这可能是 OP 的语法错误或拼写错误。

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


【解决方案1】:

这是不正确的语法。

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

这可确保兑换的帐户无效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多