同一资源的两个页面–ActiveAdmin

目前我有User模型,它在user.rb注册为ActiveAdmin的新资源。 生成的页面显示具有范围的所有用户( all / journalists / startup_employees )。 现在我想为同一资源和相同的范围创建另一个页面,但是应该只有waiting字段设置为true记录(并且前一页应该仅显示以下内容:waiting => false )。 我怎么能这样做? 我知道我可以用filter做到这一点,但我需要两个单独的页面,菜单中有两个链接。

//解决方案

它比建议更容易(谢谢你们!):

 ActiveAdmin.register User, :as => 'Waitlist User' do menu :label => "Waitlist" controller do def scoped_collection User.where(:waitlist => true) end end # code scope :all scope :journalists scope :startup_employees end 

 ActiveAdmin.register User do controller do def scoped_collection User.where(:waitlist => false) end end # code scope :all scope :journalists scope :startup_employees end 

STI( 单表inheritance )可用于在Active admin创建同一表/父模型的多个“子资源”

  1. 在用户表中添加“type”列作为字符串

  2. 将其添加到User模型以使用类型字段镜像等待字段

     after_commit {|i| update_attribute(:type, waiting ? "UserWaiting" : "UserNotWaiting" )} 
  3. 创建新模型UserWaitingUserNotWaiting

     class UserWaiting < User end class UserNotWaiting < User end 
  4. 创建Active Admin资源

     ActiveAdmin.register UserWaiting do # .... end ActiveAdmin.register UserNotWaiting do # .... end 
  5. 您可以在控制台中运行首次同步

     User.all.each {|user| user.save} 

..............

另一种方法可以是跳过类型列(步骤1,2和5)并使用范围解决其余部分。

  1. 上面的步骤3和4

  2. 然后创建范围

     #model/user.rb scope :waiting, where(:waiting => true) scope :not_waiting, where(:waiting => false) 
  3. Active Admin范围

     #admin/user.rb scope :waiting, :default => true #admin/user_not_waitings.rb scope :not_waiting, :default => true 

只需确保这两个页面中的其他范围也在wait / not_waiting上进行过滤

您可以使用参数来区分案例并根据参数呈现不同的操作:

 link_to users_path(:kind => 'waiting') 

并在users_controller.rb中

 def index if params[:kind]=='waiting' @users= Users.where(:waiting => true) render :action => 'waiting' and return else # do your other stuff end end 

然后将新的,不同的页面(部分)放在app / views / users / waiting.html.erb中

如果要为此页面使用不同的布局,请添加要呈现的布局参数:

 render :action => 'waiting', :layout => 'other_layout' and return