2010-06-07 15 views
5

Ich habe ein Modell Fahrzeug:Route Alias, ist das möglich?

Routen:

map.resources :vehicles, :has_many => :suppliers 

Alles funktioniert gut, aber Fahrzeug hat eine Boolesche Attribut is_truck. Ich möchte ein Alias ​​machen, damit ich die gleichen Ressourcen nur Lastwagen Filterung bekommen, habe ich versucht, mit:

Routen:

map.trucks '/trucks', :controller => :vehicles, :action => :index, :is_truck => true 
map.trucks '/trucks/by_supplier/:supplier', :controller => :vehicles, :action => :index, :is_truck => true 

Die erste funktioniert gut, aber wenn ich in einem Formular suchen die Sekunde funktioniert nicht und sucht alle Lieferanten.

Controller:

class VehiclesController 
    def index 
    if params[:supplier] 
     @vehicles = Vehicle.all :conditions => { :is_truck => params[:is_truck] } 
    else 
     @vehicles = Vehicle.all 
    end 
    end 
    ... 
end 

Suchen Form:

<% form_for :truck, :url => {:controller => :trucks, :action => :index}, :html => {:method => :get} do |f| %> 
    <% f.text_field :search %> 
    <% f.submit 'Search Trucks' %> 
<% end %> 

Ist es möglich, map.resources als Alias?

Antwort

1

ich eine sauberere Weg gefunden, es zu tun, aber Suche noch unter einem bestimmten Lieferanten gebrochen wird:

# Show all vehicles 
map.connect '/vehicles/supplier/:supplier', :controller => :vehicles, :action => :index 
map.resources :vehicles 

# Only show trucks 
map.connect '/trucks/supplier/:supplier', :controller => :vehicles, :action => :index, :is_truck => true 
map.resources :vehicles, :as => 'trucks', :requirements => { :is_truck => true } 

Ressource: http://api.rubyonrails.org/classes/ActionController/Resources.html

+0

Auch mit 'path_prefix' mit keinem Erfolg versucht. –

0

verarbeiten Sie es in Ihrem Controller?

smth wie:

class VehiclesController 
    def index 
    if params[:supplier] 
     @vehicles = Vehicle.all :conditions => { :supplier_id => params[:supplier] } 
    else 
     @vehicles = Vehicle.all 
    end 
    end 
end 
+0

Ja, ein bisschen anders, weil ich Thinking_Sphinx benutze, aber es ist das gleiche Prinzip –

0

nicht sicher, ob es möglich ist, einen Alias ​​zu machen, aber zumindest können Sie versuchen, Ihre Routen zu tauschen:

map.trucks '/trucks/by_supplier/:supplier', :controller => :vehicles, :action => :index, :is_truck => true 
map.trucks '/trucks', :controller => :vehicles, :action => :index, :is_truck => true 

Seit Strecken funktioniert wie ‚erste hinzugefügt - hat höhere Priorität 'Ihre Lösung könnte fehlschlagen, da map.trucks'/trucks 'catch'/trucks/by_supplier /: supplier 'auch. Ich würde auch recommed es ein wenig Refactoring:

map.with_options :controller => :vehicles, :action => :index, :is_truck => true do |v| 
    v.trucks '/trucks/by_supplier/:supplier' 
    v.trucks '/trucks' 
end 
+0

Suche innerhalb eines Lieferanten funktioniert nicht –

0

empfehle ich Ihnen eine andere Ressource zu bedienen, einfach und fügte hinzu:

map.resources :vehicles, :as => :trucks, :has_many => :suppliers 

Dann behandeln Sie es in Ihrem Controller mit so etwas wie:

def index 
    conds = {} 
    conds = { ... } if request.uri =~ /trucks/ # you can be more specific about the regexp if you need to 
    @vehicles = Vehicle.all :conditions => conds  
end 

Was man darüber nachdenkt tun?

+0

Ich möchte die Filterung in den Routen machen, weil die Suche in der Steuerung die gleiche ist, auch wenn es ein LKW ist oder nicht. Vielleicht könnte ein Routennamespace funktionieren. –

1

Sie Ihre Routen auf folgende Weise ändern:

map.resources :vehicles, :has_many => :suppliers, 
         :collection => { :trucks => :get } 

Und überprüfen rake routes für die Routen in diesem erzeugt.Es ermöglicht Ihnen, Fahrzeuge aufzulisten, die Lastwagen sind:

trucks_vehicles GET /vehicles/trucks(.:format) 
        {:controller=>"vehicles", :action=>"trucks"} 

So müssen Sie jetzt nur noch eine neue Aktion hinzuzufügen „Lastwagen“, die ähnlich wie „index“ arbeitet. Wenn Sie einen LKW oder ein anderes Fahrzeug erstellen, sollten Formulare (über Formularfelder) selbst nachverfolgen. Versuchen Sie nicht, sich mit dem Routing von Routen herumzuschlagen, was normalerweise dazu führen würde, dass Ihr App-Design fehlerhaft ist, was Sie später in Schwierigkeiten bringen wird.

Sie können sich STI ansehen (Vererbung einzelner Tabellen: eine Tabelle speichert mehrere Fahrzeugklassen). Eine andere Möglichkeit wäre, einen LKW-Controller zu erstellen, die von den Fahrzeugen Controller erbt und überschreibt einige Methoden wie so:

class TrucksController < VehiclesController 
    def new 
    @is_truck = true 
    super 
    end 
    ... 
end 

oder

class TrucksController < VehiclesController 
    before_filter :this_is_a_truck 
    ... 

    private 

    def this_is_a_truck 
    @is_truck = true 
    super 
    end 
end 

Update: ist hier ein anderer (da Sie haben eine is_truck Spalte):

class TrucksController < VehiclesController 
    around_filter :with_truck_scope 
    ... 

    private 

    # Scope every active record access with an is_truck condition 
    # you may want to put this directly into the model to get rid of the .send 
    # method and directly access "Vehicle.with_truck_scope &block" here 
    def with_truck_scope(&block) 
    Vehicle.send :with_scope, :find => { :conditions => "is_truck = 1" }, 
           :create => { :is_truck => 1 }, &block 
    end 
end 

Aber ich empfehle wirklich zuerst mit dem :collection gehen ausprobieren und :member Parameter von Rails Routing.

+0

Ich mochte den trucks_controller.rb Weg. Auf diese Weise könnte ich einfach nur Ressourcen zuordnen: Lastwagen? –

+0

@ben Ja, das wäre mit der Truck Controller-Lösung möglich ... – hurikhan77

+0

Auf dem STI-Weg können Sie "Klasse Truck hurikhan77

Verwandte Themen