ActiveAdmin单表继承常用属性形成重写

时间:2014-04-18 15:35:01

标签: ruby-on-rails ruby forms activeadmin single-table-inheritance

我正在使用ActiveAdmin,我有一个单表继承项目。我的问题很简单:可以只写一次模型公共部分的形式,或者我每次都被迫重写它?

2 个答案:

答案 0 :(得分:3)

您可以使用ruby的#to_proc并将proc转换为块。

这是我利用它的解决方案。它允许正常的代码重新加载,不扩展/猴子补丁任何现有的模块,并允许自定义管理员定义。

在此示例中,Animal是基本STI类,DogCat是从它继承的。

将以下代码放入app/admin/animal.rb

class AnimalAdminConfig
  attr_reader :opts

  def initialize(opts = {})
    @opts = opts
  end

  def to_proc
    this = self

    proc do
      scope :active

      index do
        column this.opts[:name_label], :name
        column ....
      end
    end
  end
end

将以下代码放入app/admin/cat.rb

ActiveAdmin.register(Cat, &AnimalAdminConfig.new(name_label: "Kitten's name"))

将以下代码放入app/admin/dog.rb

ActiveAdmin.register(Dog, &AnimalAdminConfig.new(name_label: "Puppy's name"))

答案 1 :(得分:2)

我遇到了和你一样的问题,这是我提出的解决方案:

我有大约4个模型都继承自Venue,我正在为每个模型重写所有参数和逻辑。

config/initializers/active_admin_shared_venue_resources.rb

中的

module ActiveAdmin
  class DSL

    def shared_venue_methods_and_traits(options={})

      #all your shared logic here

    end
  end
end

然后在admin/your_model.rb中,您只需要包含您所谓的方法:

ActiveAdmin.register InheritedModel do
  menu priority: 1

  shared_venue_methods_and_traits
end

这会将初始化程序中的所有代码注入模型中。

THE CATCH:每当您更改配置文件时,都必须重新启动服务器

更新

对于表格,我做了以下内容:

创建包含views/admin/shared/_shared_form.html.erb

中所有字段的部分

然后在views/admin/inherited_models/_your_form.html.erb中您可以输入以下内容:

<%= semantic_form_for [:admin, @inherited_model], html: {multipart: true} do |f| %>
  <%= render '/admin/shared/shared_form', f: f, venue: @inherited_model %>
<% end %>

不需要venue变量。但如果您需要

,将为您提供一种在表单中调用@inherited_model变量的方法