2013-09-23 15 views
7

Questo mi sta facendo impazzire! Ho i due modelli Lion e Cheetah. Entrambi ereditano da Wildcat.Rotte, path helper e STI in Rails 4.0

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

STI viene utilizzato qui.

Tutti vengono gestiti tramite il controller WildcatsController. Lì, ho un before_filer per ottenere il type di wildcat dal params[:type] e tutte le altre cose per usare la classe corretta.

Nel mio routes.rb, ho creato i seguenti itinerari:

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

Se ora voglio utilizzare le guide di percorso, che ricevo dalle rotte (lions_path, lion_path, new_lion_path, ecc), tutto è funziona come previsto, ad eccezione dei percorsi show e new. Ad esempio lions_path restituisce il percorso /lions. Il percorso new restituisce /lions/new?type=Lion. Lo stesso con il percorso show. Quando provo ad inserire /lions/new nel mio dominio radice, aggiunge correttamente il tipo param in background.

Quindi, la mia domanda è: perché Rails aggiunge il parametro type all'url se utilizzo l'helper del percorso? E perché solo per new e show?

Sto eseguendo Rails 4.0.0 con Ruby 2.0 utilizzando una nuova app Rails.

risposta

7

Perché utilizzare type? Perché non utilizzare i controller ereditati?

resources :lions 
resources :cheetahs 

Poi

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

Oh mio dio. Può essere così facile. Grazie per questa risposta rapida! Non volevo creare controller per ciascuno dei modelli, poiché in futuro ce ne saranno molti. Ma quello lo ha risolto! – Hiasinho

+0

Piacere mio. Questo è il potere di OOP :). Si prega di notare che i modelli saranno dei "gatti selvatici". Se si desidera utilizzare l'opinione di Lion sull'indice, è sufficiente aggiungere un metodo di indice vuoto in LionsController. Ma penso che una visione generale potrebbe fare molti lavori nella maggior parte dei casi. –

+1

@Hiasinho, dimentica di aggiungere 'singularize'. Questa soluzione ha una piccola dipendenza dal percorso, ma dovresti riuscire a superarla una volta cambiato il percorso. –