2011-04-19 88 views
4

在我的Ruby on Rails應用程序中,我很難獲得路由以很好地與單表繼承一起玩。我正在使用Ruby 1.9.2和Rails 3.0.6。這是在開發中,所以後端是SQLite3,以防有所作爲。單表在Ruby on Rails 3.0中的繼承和路由

比方說,我有兩個產品,widgetssprockets。我的應用程序會跟蹤兩個產品的錯誤編號和支持案例標籤,但錯誤和支持標籤本身存儲在其他系統中。有兩個獨立的團隊在這兩個產品上工作。

我已經爲兩種類型的bug記錄實現了單表繼承,因爲小部件bug數和鏈輪bug數的驗證規則是不同的(這兩個小組使用不同的bug跟蹤系統),並且有可能我會嚮應用程序中添加更多產品,這些產品的行爲方式大不相同。使用STI可以根據需要靈活地實施其他方法和屬性。

小部件團隊只關心小部件信息,而鏈輪團隊只關心鏈輪信息。有第三個團隊需要能夠查看小部件和鏈輪上的信息。窗口小部件團隊將訪問使用路徑/widgets應用和鏈輪團隊將訪問使用路徑/sprockets應用。我在routes.rb使用命名空間進行設置:

resources :bugs 

namespace "widgets" do 
    resources :bugs 
end 

namespace "sprockets" do 
    resources :bugs 
end 

我已經設置了以下機型其按預期方式工作時,我火了IRB和使用WidgetBug.create()SprocketBug.create()

bug.rb

class Bug < ActiveRecord::Base 
end 

widget_bug.rb

class WidgetBug < Bug 
    # Some validation rules 
end 

sprocket_bug.rb

class SprocketBug < Bug 
    # Some different validation rules 
end 

我用腳手架創建控制器和錯誤的對象視圖,然後修改了控制器,試圖推廣它,所以它可以與兩個部件的錯誤和鏈輪的錯誤使用。例如,index方法是這樣的:

def index 
    # The scaffold code lists all bugs, which is not what we want 
    # @bugs = Bug.all 

    # Only return bugs of the subclass we're looking for 
    @bugs = eval("#{params[:controller].classify}.all") 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @bugs } 
    end 
    end 

然後我用create()來填充每個類型的幾個bug數據庫。不幸的是,當我瀏覽到/widgets/bugs時,出現了這兩種產品的缺陷。一些調試後,我確定分類調用返回Widgets::BugsSprockets::Bugs,所以當我呼籲所有在其上,這似乎是對超跑,而不是對抗的子類運行。

我查看路由文件和做了相當多的谷歌搜索,但我仍然在虧損,我怎麼可以改變路由或控制器正確地完成這項工作。任何幫助將不勝感激。

+0

結帳This post http://stackoverflow.com/q/5246767/298624 – fl00r 2011-04-19 19:10:10

回答

4

結帳這個帖子:STI, one controller

路線

resources :widgets, :controller => "bugs", :type => "Widget" 
resources :sprockets, :controller => "bugs", :type => "Sprocket" 
# And I don't know if you need this 
resources :bugs, :type => "Bug" 

控制器

def index 
    @bugs = params[:type].constantize.all 
end 

UPD

namespace "widgets" do 
    resources :bugs, :type => "Widget" 
end 

namespace "sprockets" do 
    resources :bugs, :type => "Sprocket" 
end 
+0

這是非常接近我所尋找的,但不完全確切。這允許我訪問'/ widgets'下的小部件錯誤,但是我想要做的是訪問'/ widgets/bugs'下的小部件錯誤。這可能嗎? – 2011-04-19 20:54:38

+0

答案更新 – fl00r 2011-04-19 20:59:43

+0

傑出!謝謝!我從頭開始重新生成代碼時發現的一個重要警告 - 在控制器目錄中必須是一個名爲'widgets'的空目錄,或者訪問'/ widgets/bugs'將會失敗,並且** Routing Error **未初始化的常量Widgets。 – 2011-04-19 21:51:49