gpt4 book ai didi

ruby - 导轨 3 : Use 'before_create' within a module (for ActiveRecord models)

转载 作者:数据小太阳 更新时间:2023-10-29 08:28:49 24 4
gpt4 key购买 nike

我正在编写一个应用程序,其中许多(但不是全部)ActiveRecord 模型都有一个 hash 列。这是在创建时使用随机 MD5 哈希填充的,用于引用单个对象而不是其 ID。为此,我在各个模型中包含了以下模块,并在所有 Controller 中使用 find_by_id_or_hash!() 而不是 find:

module IdOrHashFindable

def self.included(base)
base.extend(ClassMethods)
end

module ClassMethods

before_create :create_hash ## <-- THIS FAILS

# legacy. in use only until find by ID is phased out altogether
def find_by_id_or_hash!(id_or_hash)
id_or_hash.to_s.size >= 32 ? find_by_hash!(id_or_hash) : find(id_or_hash)
end
end

def to_param; self.hash end
def create_hash; self.hash = Support.create_hash end

end

为了保持干爽,我想在模块内也调用 before_create。然而,我不断得到要么

undefined method `before_create' for IdOrHashFindable:Module

undefined method `before_create' for IdOrHashFindable::ClassMethods:Module

取决于我把它放在哪里。这是有道理的(毕竟,我是在调用一个函数,而不是定义它),但我仍然想知道如何做到这一点。 (我无法覆盖 before_create,因为还有其他 before_create 调用)。

此外,对于包含此模块的所有模型,都适用非常相似的测试。我如何始终如一地测试此功能?我是否编写自定义 describe ... end block 并将它 require 到它适用的每个 model_spec.rb 中?如何在不求助于全局变量的情况下传递正确的模型以供使用?

如有任何想法,我们将不胜感激!

最佳答案

您必须将类方法调用放在 class_eval 中,或者像这样直接调用它:

module IdOrHashFindable

def self.included(base)
base.extend(ClassMethods)
base.before_create :create_hash
# or
base.class_eval do
before_create :create_hash
end
end

end

因为当你将方法放在模块中时,它会直接调用它作为模块的方法

关于ruby - 导轨 3 : Use 'before_create' within a module (for ActiveRecord models),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8222827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com