2010-07-20 11 views
0

J'ai rencontré l'erreur suivante lors de la création d'une application de blog. Des idées pourquoi?NoMethodError dans Ruby on Rails


NoMethodError in Articles#show 

Showing app/views/articles/show.html.erb where line #1 raised: 

undefined method `title' for []:Array 
Extracted source (around line #1): 

1: <h2><%= @article.title %></h2> 
2: 
3: <% if @article.category %> 
4: <p class="category"> 

De ma compréhension limitée, il essaie de me dire qu'il n'y a pas de champ « title » dans ma table de base de données « article », mais comme vous pouvez le voir la desc ci-dessous il y a Cleary un champ 'titre'!

mysql> desc articles; 
+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| user_id  | int(11)  | YES |  | NULL |    | 
| title  | varchar(255) | YES |  | NULL |    | 
| synopsis  | text   | YES |  | NULL |    | 
| body   | text   | YES |  | NULL |    | 
| published | tinyint(1) | YES |  | 0  |    | 
| created_at | datetime  | YES |  | NULL |    | 
| updated_at | datetime  | YES |  | NULL |    | 
| published_at | datetime  | YES |  | NULL |    | 
| category_id | int(11)  | YES |  | 1  |    | 
+--------------+--------------+------+-----+---------+----------------+ 
10 rows in set (0.01 sec) 

Aide ?!

Bernard

Ps. J'espère que la mise en forme de la table ci-dessus tient bon ... ne semble pas très bien dans l'aperçu!


Le code du contrôleur pour l'appel correspondant est le suivant.

def show 
if is_logged_in? && @logged_in_user.has_role?('Editor') 
    @article = Article.find(params[:id]) 
else 
    @article = Article.find_all_by_published(params[:id], true) 
end 
respond_to do |wants| 
    wants.html 
    wants.xml { render :xml => @article.to_xml } 
end 
end 
+1

L'erreur suggère que vous avez reçu un tableau entier dans lequel vous pensez avoir un élément du tableau. Autrement dit, un article individuel a un titre, mais pas le tableau contenant tous les objets d'article. (Je ne travaille pas avec Rails, mais je me souviens qu'il y a un peu de magie dans la façon dont il gère les singuliers et les pluriels.Ce souvenir est assez vague, alors n'hésitez pas à l'ignorer.) – Telemachus

+0

Dans ce cas, pensez à déboguer un peu avant envoi à un forum: par exemple output @ article.class – Alexey

Répondre

5

Je pense que vous essayez d'accéder à l'élément title directement à partir du tableau. Vous devrez parcourir chaque objet avant de pouvoir accéder aux propriétés.

for @article in @articles do |a| 
    <h2><%= a.title %></h2>... 
end 

Assurez-vous d'avoir dans votre contrôleur ...

@articles = Article.find(:all, :conditions => '...') 

Mise à jour:

Cette partie de votre code renvoie une collection.

@article = Article.find_all_by_published(params[:id], true) 
+0

Hmm ... Dnno. Dans mon contrôleur, je recherche un ID particulier dans le tableau Articles, et je remplis @articles avec ce résultat? @article = Article.find (params [: id]) Pensé que cela aurait signifié que @article serait un élément et non un tableau? – mrbernz

+0

Ouais c'est le cas. Je ne faisais que spéculer. –

1

Il semble que vous attribuer un tableau vide à @article dans votre contrôleur. Il devrait plutôt être une instance de Article (si c'est le nom de votre modèle). Pouvez-vous coller votre code de contrôleur?

+0

Le code du contrôleur Relevent est le suivant: - def show \t si is_logged_in? ? && @ logged_in_user.has_role ('éditeur') \t \t @article = Article.find (params [: id]) \t autre \t \t @article = Article.find_all_by_published (params [: id], true) \t fin \t respond_to do | veut | \t \t wants.html \t \t wants.xml {render: xml => @} article.to_xml \t fin fin Alexey aimerait un pointeur sur la façon de déboguer le code Rails, au moment où je vais juste hors des fichiers journaux et de la sortie web!Worry définitivement un Rails (et de programmation) newb ... – mrbernz