Currently I have User
model, which is registered in user.rb
as a new resource for ActiveAdmin. Generated page displays all users with scopes (all
/journalists
/startup_employees
). Now I want to create another page for the same resource, and the same scopes, but there should be only records with waiting
field set to true
(and the previous page should displays only this with :waiting => false
). How could I do that? I know I could do that with filters, but I need two separate pages, with two links in menu.
// SOLUTION
It was even easier than advices (thanks guys!):
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 (Single table inheritance) can be used to create multiple "sub-resources" of the same table/parent model in Active admin
Add a "type" column in user table as a string
Add this to User
model to mirror waiting field with type field
after_commit {|i| update_attribute(:type, waiting ? "UserWaiting" : "UserNotWaiting" )}
Create the new models UserWaiting
and UserNotWaiting
class UserWaiting < User end class UserNotWaiting < User end
Create Active Admin
resources
ActiveAdmin.register UserWaiting do # .... end ActiveAdmin.register UserNotWaiting do # .... end
You can run a first-time sync in console
User.all.each {|user| user.save}
..............
Another way could be to skip the type column (steps 1,2 and 5) and solve the rest with scopes.
Step 3 and 4 above
Then create the scopes
#model/user.rb scope :waiting, where(:waiting => true) scope :not_waiting, where(:waiting => false)
Scopes in Active Admin
#admin/user.rb scope :waiting, :default => true #admin/user_not_waitings.rb scope :not_waiting, :default => true
Just make sure the other scopes in these two pages are also filtered on waiting/not_waiting
you could use a parameter to distinguish the cases and render different actions depending on the parameter:
link_to users_path(:kind => 'waiting')
and in the 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
then put your new, different page (partial) in app/views/users/waiting.html.erb
If you want to use a different layout for this page add the layout parameter to render:
render :action => 'waiting', :layout => 'other_layout' and return
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With