Две страницы для одного и того же ресурса - ActiveAdmin
В настоящее время у меня есть модель 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
Ответы
Ответ 1
STI (Наследование отдельных таблиц) можно использовать для создания нескольких "под-ресурсов" одной и той же модели table/parent в 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
Просто убедитесь, что другие области на этих двух страницах также отфильтрованы в ожидании/not_waiting
Ответ 2
вы можете использовать параметр, чтобы отличать случаи и выполнять разные действия в зависимости от параметра:
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