如何使用模块在活动管理员中拆分很长的代码?

时间:2013-04-12 19:01:17

标签: activeadmin

Activeadmin在单个文件上注册一个页面,其中包含所有逻辑:索引,显示,编辑等。

我想将task.rb拆分为task_index.rb,task_show.rb,task_edit.rb等。

那么,你应该怎么做?

注意:我知道在每个文件中创建一个ActiveAdmin.register块(如果 Task 存在,它会附加)将完成工作,但这个问题的目的是为了一般接近而不是解决这个具体的问题。

-- admin/task.rb
#encoding: utf-8

ActiveAdmin.register Task do
 [Lot's of actions]
  member_action....
  member_action....
  member_action....
  batch_action....

 [Index stuff]
  filter....
  scope....
  scope....
  scope.... 
  index do
   column...
   column...
   column...
   column...
  end

 [Edit stuff]
  form do |f|
    f.input....
    f.input....
    f.input....
    f.input....
    f.input....
  end
 [etc etc etc]
end
----------------

我正在考虑模块,但我无法弄清楚如何。

1 个答案:

答案 0 :(得分:4)

这就是我这样做的方式

模块来源

module ResourceDSL
  module ActsAsClone

    def acts_as_clone
      controller do
        def new
          instance_variable_name = active_admin_config.resource_class.to_s.underscore
          resource = active_admin_config.resource_class.find(params[:id]) rescue nil
          attrs = resource.nil? ? {} : resource.attributes
          resource = active_admin_config.resource_class.new(attrs)
          instance_variable_set("@#{instance_variable_name}", resource)
        end
      end

      action_item :only => [:show, :edit] do
        if can? :create, resource and (!resource.respond_to?(:live?) or resource.live?)
          link_to "Copy", :action => :new, :id => resource.id
        end
      end
    end
  end
end

包括ActiveAdmin :: ResourceDSL

ActiveAdmin::ResourceDSL.send :include, ResourceDSL::ActsAsClone

然后你可以

ActiveAdmin.register Account do
  menu :parent => "Billing",  :priority => 10
  acts_as_clone
end