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
不是零。
您可以通过多种方式更改它:
使用try
:
self.styles = styles.try(:-, ['']) if styles_changed?
另一个使用 try
的版本,但它的好处是能够处理两个空字符串 或 nil
值:
self.styles = styles.try(:reject, &:blank?) if styles_changed?
请注意,在这两个示例中,我都添加了 self
。 self
通常隐含在 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 - ['']
作为参数传递。
我有一个带有不同样式复选框的表单。该表单工作正常,但我在样式选项数组中保存了一个空字符串。我想删除它。所以我创建了一个 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
不是零。
您可以通过多种方式更改它:
使用
try
:self.styles = styles.try(:-, ['']) if styles_changed?
另一个使用
try
的版本,但它的好处是能够处理两个空字符串 或nil
值:self.styles = styles.try(:reject, &:blank?) if styles_changed?
请注意,在这两个示例中,我都添加了 self
。 self
通常隐含在 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 - ['']
作为参数传递。