同一资源的两个页面–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
创建同一表/父模型的多个“子资源”
-
在用户表中添加“type”列作为字符串
-
将其添加到
User
模型以使用类型字段镜像等待字段after_commit {|i| update_attribute(:type, waiting ? "UserWaiting" : "UserNotWaiting" )}
-
创建新模型
UserWaiting
和UserNotWaiting
class UserWaiting < User end class UserNotWaiting < User end
-
创建
Active Admin
资源ActiveAdmin.register UserWaiting do # .... end ActiveAdmin.register UserNotWaiting do # .... end
-
您可以在控制台中运行首次同步
User.all.each {|user| user.save}
..............
另一种方法可以是跳过类型列(步骤1,2和5)并使用范围解决其余部分。
-
上面的步骤3和4
-
然后创建范围
#model/user.rb scope :waiting, where(:waiting => true) scope :not_waiting, where(:waiting => false)
-
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