2013-09-23 21 views
7

To doprowadza mnie do szału! Mam dwa modele: Lion i Cheetah. Obaj dziedziczą po Wildcat.Trasy, pomocniki ścieżki i STI w Rails 4.0

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

Stosuje się tutaj STI.

Wszystkie są obsługiwane przez kontroler WildcatsController. Tam mam before_filer, aby uzyskać type z wildcat z params[:type] i wszystkich innych rzeczy do korzystania z właściwej klasy.

W moim routes.rb, stworzyłem następujących trasach:

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

Jeśli teraz chcesz korzystać z pomocników ścieżki, które otrzymuję od tras (lions_path, lion_path, new_lion_path, etc.), wszystko jest działa zgodnie z oczekiwaniami, z wyjątkiem ścieżek show i new. Na przykład lions_path zwraca ścieżkę /lions. Ścieżka new zwraca /lions/new?type=Lion. To samo dotyczy ścieżki show. Kiedy próbuję wprowadzić /lions/new do mojej domeny głównej, to poprawnie dodaje ona parametr typu w tle.

Moje pytanie brzmi, dlaczego Railsy dodają do adresu URL parametr type, jeśli używam helpera ścieżki? A dlaczego tylko dla new i show?

Używam Rails 4.0.0 z Ruby 2.0 za pomocą świeżej aplikacji Rails.

Odpowiedz

7

Dlaczego warto używać type? Dlaczego nie korzystać z odziedziczonych kontrolerów?

resources :lions 
resources :cheetahs 

Następnie

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

O mój boże. To może być takie proste. Dzięki za szybką odpowiedź! Po prostu nie chciałem tworzyć kontrolerów dla każdego z modeli, ponieważ będzie ich wiele w przyszłości. Ale to rozwiązało! – Hiasinho

+0

Moja przyjemność. To jest moc OOP :). Zwróć uwagę, że szablony będą "dzikimi kotami". Jeśli chcesz użyć własnego zdania Lwa na indeksie, po prostu dodaj pustą metodę indeksu w LionsController. Ale myślę, że ogólny pogląd może w większości przypadków przynieść wiele pracy. –

+1

@Hiasinho, zapomnij dodać "singularize". To rozwiązanie ma niewielką zależność od ścieżki, ale powinieneś być w stanie go pokonać po zmianie ścieżki. –