2013-09-23 10 views
7

Das macht mich verrückt! Ich habe die beiden Modelle Lion und Cheetah. Beide erben von Wildcat.Routen, Weg Helfer und STI in Schienen 4.0

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

STI wird hier verwendet.

Sie alle werden durch den Controller WildcatsController gehandhabt. Dort habe ich eine before_filer, um die type der Wildkatze von der params[:type] und allen anderen Sachen zu bekommen, um die korrekte Klasse zu verwenden.

In meinem routes.rb, habe ich die folgenden Routen:

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

Wenn ich jetzt den Pfad Helfer verwenden wollen, dass ich von den Routen erhalten (lions_path, lion_path, new_lion_path, etc.), ist alles funktioniert wie erwartet, außer den show und new Pfaden. Zum Beispiel gibt lions_path den Pfad /lions zurück. Der Pfad new gibt /lions/new?type=Lion zurück. Gleiches mit dem show Pfad. Wenn ich versuche, /lions/new in meine Stammdomäne einzugeben, fügt es den Typ param im Hintergrund korrekt hinzu.

Also meine Frage ist, warum fügt Rails den Parameter type der URL hinzu, wenn ich den Pfadhelfer verwende? Und warum nur für new und show?

Ich verwende Rails 4.0.0 mit Ruby 2.0 mit einer neuen Rails App.

Antwort

7

Warum verwenden type? Warum nicht geerbte Controller verwenden?

resources :lions 
resources :cheetahs 

Dann

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 mein Gott. Es kann so einfach sein. Danke für diese schnelle Antwort! Ich wollte einfach keine Controller für jedes der Modelle erstellen, da es in Zukunft eine Menge davon geben wird. Aber das hat es gelöst! – Hiasinho

+0

Mein Vergnügen. Das ist die Stärke von OOP :). Bitte beachten Sie, dass die Vorlagen Wildcats sind. Wenn Sie Lions eigene Meinung zum Index verwenden möchten, fügen Sie einfach eine leere Indexmethode in LionsController hinzu. Aber ich denke, eine allgemeine Ansicht könnte in den meisten Fällen viel bewirken. –

+1

@Hiasinho, vergiss, 'singularize' hinzuzufügen. Diese Lösung hat eine kleine Abhängigkeit vom Pfad, aber Sie sollten in der Lage sein, darüber hinweg zu kommen, sobald sich der Pfad geändert hat. –