在我的Ruby on Rails應用程序中,我很難獲得路由以很好地與單表繼承一起玩。我正在使用Ruby 1.9.2和Rails 3.0.6。這是在開發中,所以後端是SQLite3,以防有所作爲。單表在Ruby on Rails 3.0中的繼承和路由
比方說,我有兩個產品,widgets
和sprockets
。我的應用程序會跟蹤兩個產品的錯誤編號和支持案例標籤,但錯誤和支持標籤本身存儲在其他系統中。有兩個獨立的團隊在這兩個產品上工作。
我已經爲兩種類型的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::Bugs
或Sprockets::Bugs
,所以當我呼籲所有在其上,這似乎是對超跑,而不是對抗的子類運行。
我查看路由文件和做了相當多的谷歌搜索,但我仍然在虧損,我怎麼可以改變路由或控制器正確地完成這項工作。任何幫助將不勝感激。
結帳This post http://stackoverflow.com/q/5246767/298624 – fl00r 2011-04-19 19:10:10