1

En utilisant STI, j'essaye d'obtenir toutes les pages d'un type spécifique.Rails - classe principale, sous-classe, comment obtenir tous les enregistrements avec la sous-classe

J'ai une classe principale pages_controller.rb

class PagesController < ApplicationController 

    def index 
    @pages = Page.all 
    end 

end 

En dessous, une autre classe pages_controller.rb

class Blog < Page 

    def index 
     @pages = Blog.all 
    end 

end 

Si pas la classe Blog obtenir toutes les pages avec: type de "Blog"? Au lieu de cela, il obtient toutes les pages quel que soit le type. J'ai aussi essayé @pages = Page.where(:type => "Blog") j'accéder à l'URL http://localhost:3000/blog

Voici mes itinéraires

resources :pages do 
     collection do 
      get :gallery 
      get :list 
     end  
    end 
    resources :blog, :controller => :pages 
+0

Je pense que ce serait mieux si vous créez un contrôleur séparé, au lieu de faire une classe dans le PagesController lui-même. – Rohit

+0

Est-ce la seule façon de fonctionner? Ma peur est, si j'ai 3 ou 4: types alors j'ai besoin de 3 ou 4 contrôleurs. Et chaque contrôleur contiendrait un code similaire (par exemple - Obtenir toutes les pages par type) – jyoseph

Répondre

1

Vous devez définir une classe pour chaque type dans app/models répertoire:

# app/models/page.rb 
class Page < ActiveRecord::Base 
end 

# app/models/blog.rb 
class Blog < Page 
end 

Si vous voulez un contrôleur pour les obtenir tous les deux:

if blog? # implement this method yourself 
    @blogs = Blog.all 
else 
    @pages = Page.all 
end 

Donc, en gros, le all -method renvoie les instances de la classe sur laquelle vous l'avez appelé.

Cependant: Je vous recommande d'utiliser un contrôleur séparé pour chaque type. Ce sont des ressources différentes et doivent être traitées comme telles. Utilisez des outils comme InheritedResources pour assécher vos contrôleurs.

+0

+ 1 Merci pour la tête sur ce point. Cela m'a semblé étrange de devoir définir un modèle pour chaque type de page et de le laisser vide. Si ça marche et que c'est le seul moyen, je suis d'accord avec ça. - J'ai maintenant un contrôleur séparé et un modèle pour chaque type de page. Je pense que je reçois des erreurs maintenant parce qu'il veut de nouvelles vues pour chaque type (pouah). Est-ce là qu'InheritedResources entre en jeu? – jyoseph

+0

Une autre question rapide. Dans chaque contrôleur (Blog, Photo) dois-je créer des actions pour créer, modifier, modifier, etc.? On dirait que je duplique lentement mais sûrement beaucoup de code (seul le différentiel entre les contrôleurs est Page.new et le contrôleur de blog a Blog.new), n'est-ce pas? – jyoseph

+0

C'est pourquoi je recommande InheritedResources. Mais vous pouvez utiliser un contrôleur aussi. Les classes vides ne posent aucun problème. Ils sont ActiveRecord, donc ils ne sont pas vides du tout. – iain