在 Active Admin 中使用 concern 时,可能会遇到 concern 动态方法不能使用的问题。这是因为 Active Admin 的 DSL 把标志 symbol 转换成了字符串,而 concern 动态方法只能在使用 symbol 标志时正常工作。
以下是一个示例代码,演示了使用 concern 动态方法并将其应用于 Active Admin 资源的方法:
#定义concern动态方法
module VisibilityConcern
extend ActiveSupport::Concern
included do
scope :visible, -> { where(hidden: false) }
scope :hidden, -> { where(hidden: true) }
end
module ClassMethods
def foo
puts 'foo'
end
end
def bar
puts 'bar'
end
end
# 应用concern
ActiveAdmin.register Post do
include VisibilityConcern
permit_params :title, :body, :hidden
index do
selectable_column
column :title
column :hidden # 此处可正常使用 concern 动态方法
actions
end
# 此处定义不会报错,但实际上读取的是字符串而不是 symbol
scope :visible
scope :hidden
end
在此示例中,我们定义了一个 visibility concern 并将其应用于一个 Active Admin 资源。其中,visible
和 hidden
是 concern 动态方法,它们以 symbol 格式定义,并作为诸如 scope
和 column
之类的 Active Admin DSL 方法的参数使用。
为了正确地使用 concern 动态方法,我们希望在应用 concern 时,使用 symbol 格式。因此,在 ActiveAdmin.register
块中使用 include 关键字来应用 concern,并在 scope 和 column 之类的 DSL 方法中使用 symbol。
这样做可以很好地保持 concern 动态方法的正常工作。