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 2010-12-11 08:42:16

+0

这是唯一的方法吗?我的恐惧是,如果我有3或4种类型,那么我需要3或4个控制器。每个控制器都会包含类似的代码(例如 - 按类型获取所有页面) – jyoseph 2010-12-11 09:03:06

回答

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感谢您的支持。我不得不为每种页面类型定义模型并将其留空,这似乎很奇怪。如果它有效并且这是唯一的方法,那我就这么做了。 - 我现在有一个单独的控制器和每种页面类型的模型。我想我现在正在接受错误,因为它需要每种类型的新视图(唉)。这是继承资源进入的地方吗? – jyoseph 2010-12-11 21:21:07

+0

另一个快速问题。在每个控制器(博客,照片)中,我是否需要为新建,创建,编辑等创建操作?看起来我很慢但肯定复制了很多代码(控制器之间的差异是页面控制器有Page.new,博客控制器有Blog.new),是吗? – jyoseph 2010-12-11 21:25:28

+0

这就是我推荐InheritedResources的原因。但是你也可以使用一个控制器。空班不是问题。它们是ActiveRecord,所以它们不是空的。 – iain 2010-12-12 00:21:44