2010-11-08 6 views
5

Ho creato un percorso nidificato in un progetto Ruby on Rails 3. con il seguente percorso:Indicare se un controller viene utilizzato in una rotta nidificata in Rails 3

resources :companies do 
    resources :projects 
end 

ora posso arrivare al metodo index del contoller progetto tramite example.com/projects/id o example.com/companies/id/projects/id, ma entrambe le pagine visualizzare esattamente nel stessa maniera. Come posso modificare la pagina dei progetti nel secondo esempio per mostrare solo i progetti associati a tale azienda?

risposta

10

Vorrei cambiare il modo di esplorare i risultati. Rails 3 è bello per permetterti di farlo perché praticamente tutto è possibile.

In primo luogo nel controller avrei trovato la risorsa genitore utilizzando qualcosa di simile:

before_filter :find_company 

# your actions go here 

private 

    def find_company 
    @company = Company.find(params[:company_id]) if params[:company_id] 
    end 

Questo dovrebbe essere abbastanza semplice: trovare un record Company che ha un ID che corrisponde a quello passato in dal nidificato itinerario. Se non è nidificato, non ci sarà un params[:company_id] quindi non ci sarebbe un set di variabili @company.

Successivamente, si desidera esplorare il progetto, a seconda che sia impostato o meno un valore @company. Anche questo è facile. Proprio sotto il primo before_filter, mettere questo:

before_filter :scope_projects 

Poi definire il metodo per esso sotto il metodo find_company in questo modo:

def scope_projects 
    @projects = @company ? @company.projects : Project 
end 

Ora probabilmente stai pensando "WOAH". Lo so. Anche a me.

Ora, ovunque si faccia riferimento all'associazione projects o alla classe Project, utilizzare invece @projects. Con la potenza di questo metodo scope_projects, la vostra applicazione sarà sapere se vuoi dire "tutti i progetti, mai" o "tutti i progetti, mai, che sono in azienda specificata".

Ora, quando si arriva al punto di vista, si potrebbe fare qualcosa di simile:

<h1><% if @company %><%= @company.name %>'s<% end %> Projects</h1> 

si potrebbe anche spostare in un aiutante:

def optional_company 
    if @company 
    @company.name + "'s" 
    end 
end 

E trasformare quel brutto pezzo-o- logica in questo:

<h1><%= optional_company %> Projects</h1> 

Modificare come richiesto.

Spero che questo sia stato utile.

+0

Grazie! funziona come un fascino. – GSto

1

Con la potenza di inherited_resources si può avere nidificazione opzionale con il seguente comando:

class ProjectsController < InheritedResources::Base 
    belongs_to :company, :optional => true 
end 
Problemi correlati