2009-11-17 5 views
1

J'ai le problème suivant:vues multiples dans Rails

Dans Rails J'ai deux objets: Catégories et articles Une catégorie a de nombreux articles et un élément appartient à une catégorie.

OK. Il n'y a pas de problème. Mais maintenant, je veux afficher toutes les catégories existantes dans une barre latérale sur chaque page de mon projet.

J'ai essayé de faire les afficher comme:

<div class="sidebar"> 
    <% @categories.each do |category| %> 
    <p><%= link_to category.title, category %></p> 
    <% end %> 
</div> 

Mon contrôleur racine est catégories. Sur ma page d'accueil, le code ci-dessus fonctionnera sans aucun problème.

Mais quand je clique sur une catégorie que je reçois l'exception suivante:

*You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each* 

Extracted source (around line #2): 
2:  <% @categories.each do |category| %> 

Comment puis-je résoudre ce problème?

Désolé pour mon mauvais anglais!

Répondre

1

Vous oubliez de définir la variable @categories dans le contrôleur. Vous pouvez charger les @categories dans chaque action dont vous avez besoin pour afficher la barre latérale ou déléguer la requête à la vue sans définir de variable d'instance.

# in the controller 

def action 
    @categories = ... 
end 

# or in the view 

<div class="sidebar"> 
    <% Category.all.each do |category| %> 
    <p><%= link_to category.title, category %></p> 
    <% end %> 
</div> 

Si le code s'étend sur plusieurs vues/contrôleurs, je vous suggère d'extraire la déclaration dans un before_filter et/ou partielle.

+0

Merci! Maintenant, je l'ai ajouté before_filter: load_sidebar_categories def load_sidebar_categories @sb_categories = Category.all fin dans mon contrôleur d'application et cela fonctionne! – Newbie

Questions connexes