2010-11-08 10 views
5

hice una ruta anidada en un rubí en los carriles 3 proyecto. con la siguiente ruta:saber si un controlador está siendo utilizado en una ruta anidada en Rails 3

resources :companies do 
    resources :projects 
end 

ahora puede llegar al método del índice del controlador de proyecto a través de example.com/projects/id o example.com/companies/id/projects/id, pero ambas páginas mostrar exactamente en el Misma manera. ¿Cómo puedo cambiar la página de proyectos en el segundo ejemplo para mostrar solo los proyectos que están asociados con esa compañía?

Respuesta

10

que cambiaría la forma en que alcance los hallazgos. Rails 3 es hermoso porque te permite hacer esto porque casi todo es visible.

primer lugar en su controlador que iba a encontrar el recurso de los padres usando algo como esto:

before_filter :find_company 

# your actions go here 

private 

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

Esto debería ser bastante sencillo: encontrar un registro Company que tiene un ID que coincide con la aprobada por la anidada ruta. Si no está anidado, entonces no va a ser un params[:company_id] por lo tanto no habría un conjunto de variables @company.

Luego, si desea que el alcance del proyecto a encontrar, dependiendo de si es o no un @company se establece. Esto también es fácil. Justo debajo de la primera before_filter, poner éste:

before_filter :scope_projects 

a continuación, definir el método para ello debajo del método find_company así:

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

Ahora usted está pensando probablemente "WOAH". Lo sé. Yo también.

Ahora donde quiera que haga referencia a la asociación projects o la clase Project, use @projects en su lugar. Por el poder de este método scope_projects, su aplicación va a saber si está o no decir "todos los proyectos, jamás" o "todos los proyectos, nunca, que se encuentran en la empresa especificada".

Ahora, cuando se llega a los puntos de vista, se podría hacer algo como esto:

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

Incluso podría moverlo a un ayudante:

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

Y a su vez que feo trozo-o- lógica en esto:

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

Modificar según sea necesario.

Espero que haya sido útil.

+0

Gracias! Funciona de maravilla. – GSto

1

Con el poder de inherited_resources se puede tener anidación opcional con el siguiente controlador:

class ProjectsController < InheritedResources::Base 
    belongs_to :company, :optional => true 
end 
Cuestiones relacionadas