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)
在 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)