我如何使Active Admin跨模型显示代码DRY



我在Active Admin中有许多模型,它们具有非常相似(但不完全相同)的显示页面,如下所示:

  show do |ad|
    attributes_table do
      row :name
      row :length
      row :width
      row :height
      ...
    end
    panel "Images" do
      text_node link_to 'Add Image', new_admin_image_path(...)
      table_for ad.images do
        column "Image" do |image|
          image_tag(...)
        end
        column do |data|
          link_to :edit, edit_admin_image_path(...)
        end
        column do |data|
          link_to :delete, admin_image_path(data), method: :delete
        end
      end
    end
  end

面板"图像"代码将在每个模型中完全复制,所以我想把它放在其他地方。我一直在ViewHelper和渲染部分路径,但在这两种情况下,我最终的东西不知道什么"面板","text_node","table_for"等是。什么才是正确的做法?

ActiveAdmin使用的模板语言Arbre支持部分。你可以将重复的代码移动到arb部分中,例如app/views/admin/_images_panel.html.arb。然后是ActiveAdmin资源可以简单地调用render与部分路径和任何需要的本地变量。

show do
  attributes_table do
    # ...
  end
  render 'admin/images_panel', data: data
end

部分也可以参考通用方法resource来消除需要传入局部变量。资源就是任何资源Admin负责管理。例如:

panel "Images" do
  table_for resource.images do
    # Note use of `resource` instead of `ad` above.
    # ...
  end
end

最新更新