nil:NilClass 的未定义方法 `-' 用于现有字段的活动记录回调

undefined method `-' for nil:NilClass for active record callback of existing field

我有一个带有不同样式复选框的表单。该表单工作正常,但我在样式选项数组中保存了一个空字符串。我想删除它。所以我创建了一个 before_save 回调..

Parameters: {"utf8"=>"✓","car_form"=>{"styles"=>["","Black"]}}

查看

<%= f.input :styles, as: :check_boxes, collection: FormCollection::Styles.all %>

型号

class Car < ApplicationRecord
  before_save :remove_empty_from_styles

  def remove_empty_from_styles
     styles = (styles - ['']) if styles_changed?
  end
end

但是,我得到:

undefined method `-' for nil:NilClass

但是,如果我注释掉回调一切正常,值会像正常情况一样被保存。

注意:styles 不是零。

您可以通过多种方式更改它:

  1. 使用try

    self.styles = styles.try(:-, ['']) if styles_changed?
    
  2. 另一个使用 try 的版本,但它的好处是能够处理两个空字符串 nil 值:

    self.styles = styles.try(:reject, &:blank?) if styles_changed?
    

请注意,在这两个示例中,我都添加了 selfself 通常隐含在 Ruby 中,但是当您分配属性时,您必须指定 self,否则无法区分您是否声明了局部变量或为属性赋值。

您需要在 self 上访问 styles

def remove_empty_from_styles
  self.styles = styles - [''] if styles_changed?
end

styles = styles - ['']styles - [''] 的结果分配给名为 styles.

的局部变量

self.styles = styles - ['']self 上调用 styles= 方法,将 styles - [''] 作为参数传递。