同一资源的两个页面 - ActiveAdmin

时间:2013-05-14 14:56:16

标签: ruby-on-rails resources scope activeadmin

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

//解决方案

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

: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

2 个答案:

答案 0 :(得分:5)

STI(单表继承)可用于在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}
    
  6. ..............

    另一种方法可以是跳过类型列(步骤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
      
    4. 确保这两个页面中的其他范围也在wait / not_waiting上过滤

答案 1 :(得分: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

如果要为此页面使用不同的布局,请将layout参数添加到渲染:

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