25

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

// 解决方案

这比建议更容易(谢谢大家!):

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
4

2 回答 2

5

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

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

  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
    

只要确保这两个页面中的其他范围也被过滤等待/不等待

于 2013-05-15T08:02:12.017 回答
1

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

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
于 2013-05-14T15:08:51.860 回答