我正在使用ActiveAdmin,我有一个单表继承项目。我的问题很简单:可以只写一次模型公共部分的形式,或者我每次都被迫重写它?
答案 0 :(得分:3)
您可以使用ruby的#to_proc
并将proc转换为块。
这是我利用它的解决方案。它允许正常的代码重新加载,不扩展/猴子补丁任何现有的模块,并允许自定义管理员定义。
在此示例中,Animal
是基本STI类,Dog
和Cat
是从它继承的。
将以下代码放入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
变量的方法