Question Deux pages pour la même ressource - ActiveAdmin


Actuellement j'ai User modèle, qui est enregistré dans user.rb comme une nouvelle ressource pour ActiveAdmin. La page générée affiche tous les utilisateurs avec des étendues (all/journalists/startup_employees). Maintenant, je veux créer une autre page pour la même ressource, et les mêmes portées, mais il ne devrait y avoir que des enregistrements avec waiting champ défini sur true (et la page précédente devrait seulement afficher ceci avec :waiting => false). Comment pourrais-je faire ça? Je sais que je pourrais le faire avec des filtres, mais j'ai besoin de deux pages séparées, avec deux liens dans le menu.

// SOLUTION

C'était encore plus facile que des conseils (merci les gars!):

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

22
2018-05-14 14:56


origine


Réponses:


IST (Héritage de table unique) peut être utilisé pour créer plusieurs "sous-ressources" du même table / parent modèle dans Active admin 

  1. Ajouter une colonne "type" dans la table utilisateur en tant que chaîne

  2. Ajoutez ceci à User modèle pour mettre en miroir le champ d'attente avec le champ de type

    after_commit {|i| update_attribute(:type, waiting ? "UserWaiting" : "UserNotWaiting" )}
    
  3. Créer les nouveaux modèles UserWaiting et UserNotWaiting

    class UserWaiting < User
    end
    class UserNotWaiting < User
    end
    
  4. Créer Active Admin Ressources

    ActiveAdmin.register UserWaiting do
    # ....
    end
    ActiveAdmin.register UserNotWaiting do
    # ....
    end
    
  5. Vous pouvez exécuter une première synchronisation dans la console

    User.all.each {|user| user.save}
    

..............

Une autre méthode pourrait consister à ignorer la colonne de type (étapes 1, 2 et 5) et à résoudre le reste avec des étendues.

  1. Étape 3 et 4 ci-dessus

  2. Ensuite, créez les étendues

    #model/user.rb
    scope :waiting, where(:waiting => true)
    scope :not_waiting, where(:waiting => false)
    
  3. Scopes in Active Admin

    #admin/user.rb
    scope :waiting, :default => true
    
    #admin/user_not_waitings.rb
    scope :not_waiting, :default => true
    

Assurez-vous simplement que les autres étendues de ces deux pages sont également filtrées en attente / not_waiting


5
2018-05-15 08:02



Vous pouvez utiliser un paramètre pour distinguer les cas et effectuer différentes actions en fonction du paramètre:

link_to users_path(:kind => 'waiting')

et dans le 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

puis placez votre nouvelle page (partielle) différente dans app / views / users / waiting.html.erb

Si vous souhaitez utiliser une disposition différente pour cette page, ajoutez le paramètre de présentation à afficher:

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

1
2018-05-14 15:08