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