【问题标题】:Two pages for the same resource - ActiveAdmin同一资源的两个页面 - ActiveAdmin
【发布时间】:2013-05-08 22:19:28
【问题描述】:

目前我有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

【问题讨论】:

  • 这种情况下的文件名应该是什么

标签: ruby-on-rails resources scope activeadmin


【解决方案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

【讨论】:

    【解决方案2】:

    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
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 2012-01-17
      相关资源
      最近更新 更多