2010-12-02 18 views
1

J'essaie d'apprendre Ruby mais je GEEP obtenir cette erreur:Ruby on Rails Erreur: L'erreur est survenue lors de l'évaluation nil.each

L'erreur est survenue lors de l'évaluation nil.each

J'étais lire ici la "Mise en route" Guide http://guides.rubyonrails.org/getting_started.html

Voici un morceau de code index.html.erb:

<h1>Listing snippets</h1> 
<div class="snippets"> 
<% @posts.each do |post| %> 
    <h2><%= post.title %></h2> 
    <p><%= link_to 'View', post %> | <%= link_to 'Edit', edit_post_path(post) %> | <%= link_to 'Delete', post, :confirm => 'Are you sure?', :method => :delete %></p> 
<% end %> 
</div> 

Maintenant, le @posts var dans posts_controller.rb

def index 
    @posts = Post.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
    end 
    end 

Qu'est-ce que je fais mal? Merci.

PS: Je vois qu'ils sont affichés ici http://127.0.0.1:3000/posts mais si je veux les afficher dans le dossier racine (http://127.0.0.1:3000/)

Répondre

2

Vous devez créer un partial et mettre cette logique de post à l'intérieur. Ensuite, vous pouvez le placer dans n'importe quelle vue tant que vous initialisez la collection à l'intérieur de chaque action de contrôleur utilisée.

Donc, dans votre contrôleur de la maison que vous souhaitez toujours besoin:

@posts = Post.find(:all) 

En ce qui concerne votre première question, essayez de les trouver via @posts = Post.find(:all)

+0

Merci Chuck qui a fonctionné. –

+0

Pas de problème! Bonne route. –

1

Ajouter un itinéraire à routes.rb (pour seulement 2.x Rails):

map.root :controller => "posts", :action => "index" 

pour 3.x Rails un coup d'oeil ici: http://guides.rubyonrails.org/routing.html#using-root

L'erreur tout en évaluant nil.each signifie que @posts n'est pas un tableau. Avez-vous créé une table de messages?

+0

Oui, je peux les voir sur les postes/mais je pensais à un type de variable globale à afficher dans home/index.html.erb. Existe-t-il une telle chose? –

+0

Comment pouvez vous voir les publications et obtenir l'erreur nil.each en même temps? Quelque chose n'a pas de sens. –

+0

Je reçois l'erreur nil.each seulement dans le fichier index.html.erb, qui est en fait la racine mais dans la vue/posts je peux les voir. Mais je souhaite les lister dans la maison (racine). –

1

L'erreur est (comme vous avez probablement doutiez) qui se passe dans le ligne suivante:

<% @posts.each do |post| %> 

@posts d'une certaine façon finit par être nul, même si nous voulons que ce soit une liste.

C'est un peu bizarre, car le code ci-dessus semble fonctionner. Je vais essayer de vous aider à localiser le problème. Post.all équivaut à Post.find (: all), et selon the documentation for find, il pourrait revenir à zéro, mais je ne sais pas quand cela arrivera en pratique. Normalement, il doit retourner une liste vide ([]) s'il n'y a pas de messages dans la base de données, ou déclencher une exception si la table de base de données n'existe pas du tout.

Donc, juste au cas où Post.all renvoie en quelque sorte zéro, essayez @posts = [] au lieu de @posts = Post.all dans le contrôleur.Le .each devrait alors fonctionner.

Si (comme je le soupçonne), ce n'est pas le cas, j'imagine qu'un contrôleur différent de celui que vous avez posté ci-dessus est exécuté. Ensuite, parce que @posts n'a jamais été défini, essayer d'y accéder vous donnera simplement zéro, ce qui explique l'erreur. Vérifiez donc vos chemins et vos noms de classe, et assurez-vous que le code que vous croyez s'exécutera effectivement s'exécute. Un espoir qui vous aide à comprendre ce qui ne va pas - et laissez-nous savoir ce qui a résolu le problème pour vous!