ActiveAdmin:如何将Panel添加到Form块中?

时间:2013-11-15 20:31:56

标签: ruby-on-rails ruby forms activeadmin

我已经重新使用了show块上显示的附件面板。

我希望它也显示在form块上,用于编辑。

这可能吗?

我尝试过这样的事情:

form do |f|
  #! attachments_panel:
  panel "Attachments" do
  ul do
    # (..) li components
  end

  #! Editing form
  f.inputs 'Details' do
    f.input :name
    # (..) other inputs
  end

end

但它只显示小组,表格不包括在内。 改变另一个也只显示面板。


编辑:根据@ CMaresh的解决方案,我创建了一个初始化程序,用于对ActiveAdmin gem进行monkeypat。

#! config/initializers/active_admin_patches.rb
ActiveAdmin::FormBuilder.class_eval do
  def append_panel(&block)
    self.form_buffers.last << Arbre::Context.new({}, self.template, &block)
  end
end

这样,它允许使用原始示例代码,如下所示:

form do |f|
  #! attachments_panel:
  f.append_panel do            # <----
    panel "Attachments" do
    ul do
      # (..) li components
    end
  end

  #! Editing form
  f.inputs 'Details' do
    f.input :name
    # (..) other inputs
  end

end

1 个答案:

答案 0 :(得分:7)

该问题是由底层形式和Arbre缓冲区如何起作用引起的。两种缓冲技术彼此不完全兼容,但要实现您想要的功能,您可以直接在表单的缓冲区中执行操作:

form do |f|
  f.form_buffers.last << Arbre::Context.new({}, f.template) do
    panel "Panel Above Form" do
      ul do
        li "item 1"
        li "item 2"
      end

      attributes_table_for(f.object) do
        row :name
      end
    end
  end

  f.inputs
end

Arbre::Context有两个参数:分配哈希和辅助对象。传递f.template以访问视图中可用的所有相同帮助方法非常重要。

ApplicationHelper

可以编写帮助程序以减轻每次创建新上下文的噪音:

# app/helpers/application_helper.rb
module ApplicationHelper
  def append_arbre(f, &block)                                                   
    f.form_buffers.last << Arbre::Context.new({}, f.template, &block)           
  end
end

# app/admin/resource.rb
form do |f|
  append_arbre(f) do
    panel "Panel Above Form" do
      para "Without all the noise."
    end
  end

  f.inputs
end