1

При использовании STI я пытаюсь получить все страницы определенного типа.Rails - основной класс, подкласс, как получить все записи с подклассами

У меня есть главный класс в pages_controller.rb

class PagesController < ApplicationController 

    def index 
    @pages = Page.all 
    end 

end 

Ниже, что у меня есть еще один класс в pages_controller.rb

class Blog < Page 

    def index 
     @pages = Blog.all 
    end 

end 

не должны класс Блог получить все страницы с: типа «Блог»? Вместо этого он получает все страницы независимо от типа. Я также попытался @pages = Page.where(:type => "Blog") я получить доступ к URL http://localhost:3000/blog

Вот мои маршруты

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

Я думаю, было бы лучше, если бы вы создали отдельный контроллер вместо того, чтобы создавать класс в самом портале PagesController. – Rohit

+0

Это единственный способ, которым это будет работать? Мой страх, если у меня есть 3 или 4: типы, тогда мне понадобится 3 или 4 контроллера. И каждый контроллер будет содержать похожий код (например, - Получение всех страниц по типу). – jyoseph

ответ

1

Вам нужно определить класс для каждого типа в app/models каталоге:

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

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

Если вы хотите, чтобы один контроллер получил их оба:

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

Итак, по сути, метод all возвращает экземпляры класса, на который вы его вызвали.

Однако: Я бы рекомендовал вам использовать отдельный контроллер для каждого типа. Они разные ресурсы и должны быть исправлены как таковые. Используйте инструменты, такие как InheritedResources, чтобы высушить контроллеры.

+0

+1 Спасибо за то, что у него на голову. Мне просто показалось странным определить модель для каждого типа страницы и оставить ее пустой. Если это сработает, и это единственный способ, я не согласен с этим. Теперь у меня есть отдельный контроллер и модель для каждого типа страницы. Я думаю, что сейчас получаю ошибки, потому что ему нужны новые виды для каждого типа (ть). Это где InheritedResources вступает в игру? – jyoseph

+0

Еще один быстрый вопрос. В каждом контроллере (Blog, Photo) мне нужно создавать действия для новых, создавать, редактировать и т. Д.? Похоже, я медленно, но верно дублирую много кода (только разница между контроллерами заключается в том, что контроллер страницы имеет Page.new, а контроллер блога имеет Blog.new), правильно? – jyoseph

+0

Вот почему я рекомендую InheritedResources. Но вы можете использовать один контроллер. Пустые классы не проблема. Это ActiveRecord, поэтому они не пустые. – iain

Смежные вопросы