這可能是一個非常簡單的問題,但我想關注它添加了一個驗證,其引數取決于派生類中的方法。例如,我想關注 SlugHelpers 如下
module SlugHelpers
extend ActiveSupport::Concern
included do
validates :slug, uniqueness: { case_sensitive: false, message: "Slug must be unique", scope: slug_scope }, presence: true,
end
class_methods do
def slug_scope
[]
end
end
end
但是然后有一個模型 Post 覆寫 slug_scope,例如,
class Post < ApplicationRecord
include SlugHelpers
def self.slug_scope
[:stream_id, :stream_type]
end
我希望 Post 中定義的 slug_scope 覆寫包含的 do 中使用的 slug_scope (盡管我可能稱錯了,也許我需要 self.class.slug_scope)但正如所寫的那樣,我認為這不起作用(不是包含在派生類定義其方法之前執行)?
我可以使用前置做以某種方式做到這一點嗎?還是我寫這個的方式大致正確?我知道包含的模塊是在派生類之前進入繼承鏈的,但我顯然對包含的 do 塊中的代碼何時/何地執行感到困惑。
uj5u.com熱心網友回復:
正如@mu_is_too_short 所述,您可以創建一個類方法,在呼叫時將驗證添加到類中:
module SlugHelpers
extend ActiveSupport::Concern
class_methods do
def has_slug(name = :slug, scope: :default_value)
validates_uniqueness_of name,
case_sensitive: false,
message: "Slug must be unique",
scope: scope
validates_presence_of name
end
end
end
這是 Ruby 中使模塊提供的行為可配置的通常首選方式。
class Foo
include SlugHelpers
has_slug(scope: [:foo, :bar])
end
class Bar
include SlugHelpers
has_slug(scope: [:baz, :bar])
end
雖然您實際上可以在包含模塊時呼叫類上的方法,但如果您想覆寫子類中的行為,則會產生非常奇怪的結果,因為它仍然會在包含模塊時進行評估。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/424100.html
上一篇:將毫秒轉換為時間而不會丟失精度
