我正在編寫一個應用程序,其中許多(但不是全部)ActiveRecord模型具有hash
列。這是使用隨機MD5散列創建時填充的,用於引用單個對象而不是其ID。要做到這一點,我已經包括在相應的模型下面的模塊,並在所有的控制器,而不是find
使用find_by_id_or_hash!()
:Rails 3:在模塊中使用'before_create'(適用於ActiveRecord模型)
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
塊和require
寫入每個model_spec.rb
的適用範圍?如何在不訴諸全局變量的情況下傳遞正確的模型?
任何想法,將不勝感激!
我d建議使用[ActiveSupport關注](http://opensoul.org/blog/archives/2011/02/07/concerning-activesupportconcern/) – tjwallace
感謝有關Concern的信息。不知道。 – cvshepherd