6

我有一個叫做Spaces的模型,它有不同類型的地方......比如酒吧,餐廳等等。它有相同的列,相同的模型,控制器等等。沒有花哨的STI,我只是有一個字段叫做Space_type,我想確定一條別名路線。軌道路由別名

相反的domain.com/spaces/12345這將是/bars/12345/clubs/12345

目前我有:

resources :spaces do 
    collection do 
     get :update_availables 
     get :update_search 
     get :autocomplete 
    end 
    member do 
     post :publish 
     post :scrape 
    end 
    resources :photos do 
     collection do 
     put :sort 
     end 
    end 

    resources :reviews 
    end 

此外,有沒有一種方法,我可以這樣做,這樣任何時候我用的是space_url它可以找出哪些一個使用?

回答

6

路線不是直接與模型交互的方式。所以,只要你寫一條標準路線,就可以使事情順利進行。例如,爲了使像你spaces_controller(或其他控制器的名字),你可以創建路線/bars/12345/clubs/12345

scope :path => '/bars', :controller => :spaces do 
    get '/:id' => :show_bars, :as => 'bar' 
end 

scope :path => '/clubs', :controller => :spaces do 
    get '/:id' => :show_clubs, :as => 'clubs' 
end 
5
# routes.rb 
match "/:space_type/:id", :to => "spaces#show", :as => :space_type 

# linking 
link_to "My space", space_type_path(@space.space_type, @space.id) 

這將產生此網址:/bars/123/clubs/1 ...任何space_type你有

它看起來像STI沃爾德做這個工作少許清潔劑;)

UPD

你也可以添加約束,以防止某些衝突:

match "/:space_type/:id", :to => "spaces#show", :as => :space_type, :constraints => { :space_type => /bars|clubs|hotels/ } 

是的 - 這是好主意,把這個潰敗的所有其他路線的底部

你也可以把它包裝成一個輔助(和重寫默認space_url):

module SpacesHelper 
    def mod_space_url(space, *attrs) 
    # I don't know if you need to pluralize your space_type: space.space_type.pluralize 
    space_type_url(space.space_type, space.id, attrs) 
    end 
end 
+0

不會 「/:空間類型/:ID」:以=> 「空間#秀」,:如=>:空間類型干擾的所有的休息我的控制器與空間無關? – holden 2011-04-15 10:01:17

+0

不,它不會。關於STI,鏈接和路由簽出:http://stackoverflow.com/questions/5246767/sti-one-controller/5252136#5252136 – fl00r 2011-04-15 10:04:08

+2

您需要確保「/:space_type /:id」低於您的其他頂級config/routes.rb中的資源聲明不會干擾。 Rails總是可以路由自己,但是如果你在自定義匹配器下面聲明瞭「資源:華夫餅」,某人可以導航到「/ waffles/1234」,並且它會將它作爲華夫餅類型路由到空間控制器。 – 2011-04-15 11:53:04