2010-10-12 6 views
0

Donc, je fais un tutoriel d'entraînement essentiel de lynda.com Rails, et j'obtiens une erreur que le didacticiel vidéo ne fait pas. Je suppose que cela a à voir avec les différentes versions de Ruby & Rails que j'utilise (le dernier en date d'aujourd'hui) par opposition à celles qu'ils utilisaient quand cela a été enregistré (je pense en 2007).Méthode non définie/NoMethodError dans Rails 3

C'est ce que mon contrôleur ressemble à:

classe PublicController < ApplicationController

def album_list 
    @albums = Album.find_by_sql('SELECT * FROM albums;') 
end 

def alt_album_list 
    release_date = '2011-10-01' 
    artist = 'Paul' 
    @albums = Album.find(:all, 
     :conditions => ["release_date <= ? AND artist LIKE ?", release_date, '%' + artist + '%'], 
     :order => 'release_date ASC', 
     :limit => 1, :offset => 1) 
    render(:action => 'album_list') 
end 

def one_album_list 
    release_date = '2011-10-01' 
    artist = 'Paul' 
    @album = Album.find(:first, 
     :conditions => ["release_date <= ? AND artist LIKE ?", release_date, '%' + artist + '%'], 
     :order => 'release_date ASC')    
end 

fin

C'est ce que mon point de vue ressemble à:

<html> 
<head> 
<title></title> 
</head> 

<body> 

    Title: <%= @album.title %><br /> 
    Artist: <%= @album.artist %><br /> 
    Genre: <%= @album.genre %><br /> 


</body> 
</html> 

L'erreur que je obtenir quand je le charge est:

NoMethodError in Public#show_album 

Showing C:/Users/<username>/music_library/app/views/public/show_album.rhtml where line #8 raised: 

undefined method `title' for nil:NilClass 
Extracted source (around line #8): 

5: 
6: <body> 
7: 
8: Title: <%= @album.title %><br /> 
9: Artist: <%= @album.artist %><br /> 
10:  Genre: <%= @album.genre %><br /> 
11:  
Rails.root: C:/Users/<username>/music_library 

Application Trace | Framework Trace | Full Trace 
app/views/public/show_album.rhtml:8:in `_app_views_public_show_album_rhtml___574395264_32579964__949661750' 

Répondre

-2

Je l'ai compris. Je sélectionnais la mauvaise action 'show_action' quand l'action dans mon contrôleur était 'one_album_list'.Donc quand j'ai renommé l'action en 'show_action' et que je suis passé à url/public/show_action cela fonctionne.

+3

Bien que vous pensiez avoir résolu votre problème apprendre les bonnes pratiques Rails à partir des bonnes sources. Cela vous épargnera beaucoup de peine plus tard. – allesklar

+0

La réponse de Maran est correcte. Vous devriez suivre son conseil. – maxiperez

9

Laissez-moi commencer par vous dire c'est horrible si pas à jour l'exemple de code

def album_list 
    @albums = Album.find_by_sql('SELECT * FROM albums;') 
end 

est-il vraiment dans cet arrêt vidéo maintenant regarder car il fera plus de bien que du mauvais.

Ruby on Rails a une documentation très à jour et bien écrite au guides.rubyonrails.com et j'ai aussi entendu beaucoup de choses sur http://railstutorial.org/.

Maintenant, je vais essayer de répondre à votre question, mais comme ce code n'a presque aucun sens, c'est plutôt difficile.

changement

def album_list 
    @albums = Album.find_by_sql('SELECT * FROM albums;') 
end 

à

def index 
    @albums = Album.all 
end 

Déplacer & renomme vue pour app/views/albums/index.html.erb

Et assurez-vous de changer

Title: <%= @album.title %><br /> 
    Artist: <%= @album.artist %><br /> 
    Genre: <%= @album.genre %><br /> 

à

<% @albums.each do |album| %> 
    Title: <%= album.title %><br /> 
    Artist: <%= album.artist %><br /> 
    Genre: <%= album.genre %><br /> 
    <% end %> 

et définir un itinéraire dans vos itinéraires fichier resources :albums

J'espère que cela vous aide sur le chemin droit à Rails de mastering.

+0

Eh bien, le tutoriel était juste en train de nous montrer la première ligne (à des fins d'illustration pour nous montrer comment nous pourrions le faire en utilisant SQL droit). Mais si vous regardez plus bas, vous verrez les rails (d'utiliser des méthodes de rails) pour accéder à la db - plutôt que d'utiliser une syntaxe SQL directe comme ça. Vous avez raison cependant, mais ils ont souligné cela. – marcamillion

+0

Jetez un coup d'œil sur les railsguides, ainsi que les screencasts sur le site officiel de Rails. – Jacob

2

méthode non définie title » pour nul: NilClass

Cette erreur indique qu'aucun enregistrement n'a été trouvé dans votre base de données et @album a été mis à nil. Veillez à fournir un code de protection avant d'essayer d'accéder aux propriétés d'un objet extrait de la base de données.

+0

Cette erreur montre donc que rien n'a été renvoyé par la base de données? Est-ce ainsi que je lis une erreur comme celle-ci à l'avenir? Je pensais que c'était en train de dire quelque chose comme s'il n'y avait pas de titre caractéristique de cette méthode - c'est pourquoi cela me déroutait. Si c'est une entrée non trouvée dans la base de données, cela prend tout son sens et je sais comment corriger cela. Mais je me débattais avec le problème de l'objet/méthode. Merci. – marcamillion

+1

Ce type d'erreur indique que @album n'a reçu aucune valeur particulière dans le contrôleur. Vous auriez pu oublier d'assigner quelque chose ou oui, cela aurait pu être le résultat d'un enregistrement qui n'a pas été trouvé dans la base de données. Une note supplémentaire: à mon humble avis, il est préférable de concentrer le code qui accède à la base de données dans les modèles. Les contrôleurs devraient être responsables d'autres choses, principalement la définition de variables à partir des méthodes du modèle pour les vues, le traitement des erreurs renvoyées par les modèles (comme l'album vide), le choix de la vue à charger, etc .. – Tumas

Questions connexes