ActiveAdmin 如何装饰关联链接

ActiveAdmin how to Decorate associated links

在 ActiveAdmin 中,我知道我可以使用 decorators, like Draper, to feed display_name and name, but how do I use the decorator for simple association links (i.e. auto_link(resource))?

假设我有一个 Post 和一个评论:

# Post.rb
class Post
  has_many :comments
end

# Comment.rb
class Comment
  belongs_to :post
end
# decorators/post_decorators.rb
class PostDecorator
  def name
    "Custom Post Name ##{object.id}"
  end
end
# admin/post.rb
ActiveAdmin.register Post do
  delegate_with PostDecorator
end

# admin/comments.rb
ActiveAdmin.register Comment do
  index do
    # ...
    column :post
    # ...
  end

  show do
    default_main_content
  end
end

当查看评论ActiveAdmin 区域时,显示的default_main_content 和索引的column :post 都link 自动到Post 对象,但从不使用装饰器。

我会在这些部分中看到:Post #4 而不是 Custom Post Name #4

当我访问 Post 管理区域时,它会很好地使用装饰名称。

如何在整个管理区域自动 link 使用 Draper?

我目前在对象本身上有一个 def name,但那是一个显示 属性,我想将它移到装饰器中。

如果您使用 Draper,您可以使用 decorates_association 告诉一个装饰器装饰它的关联。这需要您有 CommentDecorator.

class CommentDecorator < Draper::Decorator
  delegate_all
  decorates_association :post
end

ActiveAdmin.register Comment do
  decorate_with CommentDecorator

  ...
end

@nitsujri 你可以写一个 draper concern,你可以将它包含在你的所有装饰器中,这些装饰器在功能上为你处理所有关联。像你一样,我也厌倦了必须自己管理关联 - 这意味着在另一个地方跟踪关联。

这是一个简单的问题,它依赖于使用 activerecord 反射从现有对象中提取所有名称并将它们扔给 drapers decorates_associations 方法。

module AutoDecorateAssociations
  extend ActiveSupport::Concern

  included do
    delegate :class, to: :object, prefix: true
    decorates_associations *(object_class.reflect_on_all_associations.map(&:name) - [:versions])
  end
end

然后只是 include AutoDecorateAssociations 在你不想跟踪的装饰器上(不幸的是你不能把它扔进你的 application_decorator)