覆盖模型中的保存方法
Overriding save method in model
我是 Ruby/Rails 的新手,我想覆盖 save
方法,这样我就可以在调用实际的 save
方法之前对自己进行一些检查,但是,我由于某种原因出现此异常:
#<NoMethodError: undefined method `save' for true:TrueClass>
这是我的模块代码 class。
模块:
module OverrideSave
def save
super.save if some_condition_true
end
end
Class:
class CardTransaction
include Mongoid::Document
include Mongoid::Timestamps::Created
prepend OverrideSave
field :type, type: String
field :transaction_value, type: BigDecimal
field :receipt_value, type: BigDecimal
field :store_id, type: String
belongs_to :card
end
我不确定哪里出了问题,有什么想法吗?
为什么要尝试在 super
(即 save
)returns 上调用 save
?根据你的描述,你想要这样的东西:
def save
# some additional work
super
end
如@Marek所述
module OverrideSave
def save
super if some_condition_true
end
end
但是覆盖save
方法不是好的行为,最好创建一个使用save方法的新方法,所以你仍然有save
方法。
module OverrideSave
def save_with_guard
save if some_condition_true
end
end
您不需要重写上面的 save
方法。您可以在模型中使用 before_save
callback:
class CardTransaction
before_save :do_some_validation
private
def do_some_validation
# will get there before the save is called
false if custom_validation
end
end
我是 Ruby/Rails 的新手,我想覆盖 save
方法,这样我就可以在调用实际的 save
方法之前对自己进行一些检查,但是,我由于某种原因出现此异常:
#<NoMethodError: undefined method `save' for true:TrueClass>
这是我的模块代码 class。
模块:
module OverrideSave
def save
super.save if some_condition_true
end
end
Class:
class CardTransaction
include Mongoid::Document
include Mongoid::Timestamps::Created
prepend OverrideSave
field :type, type: String
field :transaction_value, type: BigDecimal
field :receipt_value, type: BigDecimal
field :store_id, type: String
belongs_to :card
end
我不确定哪里出了问题,有什么想法吗?
为什么要尝试在 super
(即 save
)returns 上调用 save
?根据你的描述,你想要这样的东西:
def save
# some additional work
super
end
如@Marek所述
module OverrideSave
def save
super if some_condition_true
end
end
但是覆盖save
方法不是好的行为,最好创建一个使用save方法的新方法,所以你仍然有save
方法。
module OverrideSave
def save_with_guard
save if some_condition_true
end
end
您不需要重写上面的 save
方法。您可以在模型中使用 before_save
callback:
class CardTransaction
before_save :do_some_validation
private
def do_some_validation
# will get there before the save is called
false if custom_validation
end
end