2010-11-08 15 views
5

J'ai fait une route nichée dans un Ruby on Rails 3 projets. avec le routage suivant:savoir si un contrôleur est utilisé dans un itinéraire imbriquée dans Rails 3

resources :companies do 
    resources :projects 
end 

maintenant je peux obtenir à la méthode de l'indice du projet via contoller example.com/projects/id ou example.com/companies/id/projects/id, mais les deux pages affichent exactement dans la même manière. Comment puis-je modifier la page des projets dans le second exemple pour afficher uniquement les projets associés à cette société?

Répondre

10

je changerais la façon dont vous la portée des découvertes. Rails 3 est magnifique pour vous permettre de le faire car à peu près tout est possible.

Tout d'abord dans votre contrôleur je trouverais la ressource parent en utilisant quelque chose comme ceci:

before_filter :find_company 

# your actions go here 

private 

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

Cela devrait être assez simple: trouver un enregistrement Company qui a une carte d'identité qui correspond à celui passé depuis l'imbriquée route. S'il n'est pas imbriqué, il n'y aura pas de params[:company_id] donc il n'y aura pas de jeu de variables @company.

Ensuite, vous souhaitez étendre la recherche de projet, selon qu'un @company est défini ou non. C'est facile aussi. Juste sous le premier before_filter, mettre celui-ci:

before_filter :scope_projects 

Définissez ensuite la méthode pour elle sous la méthode find_company comme ceci:

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

Maintenant, vous pensez probablement « WOAH ». Je connais. Moi aussi.

Maintenant, où que vous référeniez l'association projects ou la classe Project, utilisez @projects à la place. Par la puissance de cette méthode scope_projects, votre application saura si vous voulez dire "tous les projets, jamais" ou "tous les projets, jamais, qui sont dans l'entreprise spécifiée".

Maintenant, quand vous arrivez à la vue, vous pourriez faire quelque chose comme ceci:

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

Vous pouvez même le déplacer dans une aide:

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

Et ce vilain tour beau mec-o- logique dans ceci:

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

Modifier comme requis.

Hope this a été utile.

+0

Merci! fonctionne comme un charme. – GSto

1

Avec la puissance de inherited_resources vous pouvez avoir l'imbrication en option avec le contrôleur suivant:

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