2013-09-23 65 views
7

這讓我瘋狂!我有兩個型號LionCheetah。兩者都從Wildcat繼承。Rails 4.0中的路徑,路徑助手和STI

class Wildcat < ActiveRecord::Base; end 
class Lion < Wildcat; end 
class Cheetah < Wildcat; end 

STI在這裏使用。

他們都通過控制器WildcatsController處理。在那裏,我有一個before_filer以獲得來自params[:type]的wildcat的type以及所有其他的東西來使用正確的類。

在我routes.rb,我創建了以下路線:

resources :lions, controller: 'wildcats', type: 'Lion' 
resources :cheetahs, controller: 'wildcats', type: 'Cheetah' 

如果我現在想用的路徑幫手,我從路線(lions_pathlion_pathnew_lion_path等)得到,一切都按照預期工作,除了shownew路徑。例如lions_path返回路徑/lionsnew路徑返回/lions/new?type=Lion。與show路徑相同。當我嘗試向我的根域輸入/lions/new時,它正確地在後臺添加了類型參數。

所以,我的問題是,爲什麼Rails將type參數添加到url,如果我使用路徑助手?爲什麼只爲newshow

我使用新鮮的Rails應用程序在Ruby 2.0中運行Rails 4.0.0。

回答

7

爲什麼要用type?爲什麼不使用繼承的控制器?

resources :lions 
resources :cheetahs 

然後

class LionsController < WildCatsController 
end 

class CheetahController < WildCatsController 
end 

class WildCatsController < ApplicationController 
    before_filter :get_type 

    def index 
    @objs = @klass.scoped 
    end 

    def show 
    @obj = @klass.find(params[:id]) 
    end 

    def new 
    @obj = @klass.new 
    end 

    # blah blah 

    def get_type 
    resource = request.path.split('/')[0] 
    @klass = resource.singularize.capitalize.constantize 
    end 
+0

天啊。它可以是那麼簡單。感謝您的快速回答!我只是不想爲每個模型創建控制器,因爲將來會有堆控制器。但是那解決了它! – Hiasinho

+0

我的榮幸。這是OOP的力量:)。請注意模板將是wildcats'。如果您想在索引中使用Lion自己的說法,只需在LionsController中添加一個空白的索引方法即可。但我認爲一般觀點在大多數情況下可以做很多工作。 –

+1

@Hiasinho,忘記添加'singularize'。這個解決方案對路徑有一點依賴性,但是一旦路徑改變,你應該能夠克服它。 –