IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

You have a nil object when you didn't expect it!


Sujet :

Ruby on Rails

  1. #1
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut You have a nil object when you didn't expect it!
    Bonjour,
    j'essaie d'apprendre par moi même la programmation Ruby on Rails.
    En suivant un tuto j'ai fait un mini projet bateau qui a deux tables : articles et commentaires, un controller et deux vues.
    lorsque j'appelles mon projet depuis mon navigateur ça fonctionne jusqu'au moment où j'essaies d'ajouter un article. A ce moment j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    You have a nil object when you didn't expect it!
    You might have expected an instance of ActiveRecord::Base.
    The error occurred while evaluating nil.[]
    voici mon controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    class MonsiteController < ApplicationController
        def index
            listeArticle
           # render_action "listeArticle"
        end
        def listeArticle
            @articles= Article.find(:all, :order => "created_at DESC", :limit => 5)
        end
        def ajoutArticle
            article= Article.new(@params["article"])
            if article.save
                flash[:ok]= "article ajouté"
            else
                flash[:error]= "erreur d'ajout"
            end
            redirect_to :action => "listeArticle"
        end
        def afficheArticle
            @notes=[]
            11.times do |note|
                @notes.push(note)
            end
            @article= Article.find_by_id(@params["id"])
        end
        def ajoutCommentaire
            comment= Commentaire.new(@params["commentaire"])
            comment.article= Article.find_by_id(@params["articleid"])
            if comment.save
                flash[:ok]= "commentaire ajouté"
            else
                flash[:error]= "erreur d'ajout"
            end
            redirect_to :action => "afficheArticle", :id => comment.article.id
        end
    end
    je me suis contenté (pour l'instant) de copier le tuto pour voir comment ça fonctionne et essayer de comprendre....je n'ai fait que commenter le render_action car sinon j'avais une erreur undefined method
    pourriez-vous m'aider sur cette erreur ("You have a nil....") svp ??
    merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  2. #2
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    Hello,

    normalement, lorsqu'une erreur pareille est générée, le message mentionne également la ligne ou l'erreur s'est produite, ce qui te permet de savoir facilement laquelle des méthodes est à corriger.

    Dans ton cas, le message généré indique qu'une des méthodes ne peut s'effectuer car l'objet qu'elle doit traiter est null

    ex: tu ne pourras jamais ajouter un objet null dans la DB sans que cette même erreur soit générée

    Avec quel éditeur travailles tu ?
    24 hours a day ... never enough

  3. #3
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    c'est la ligne 23 soit la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @article= Article.find_by_id(@params["id"])
    je suis désolé de ne pas avoir pensé à le mettre......
    je pense que c'est une erreur simple mais comme je ne connais pas encore assez le langage pour l'identifier tout seul...
    j'utilise la console pour générer le code automatiquement (rails, db:migrate, etc...) et emacs pour coder.....
    <mode="myLife">étant sous Linux j'utilise un tty pour ça je trouve ça fait plus geek (et puis ça évite de switcher entre 36 fenêtres : le tuto, le navigateur, la console et l'éditeur...
    là j'ai un tty pour le navigateur et le tuto et et un pour le reste)</mode>
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Ton tuto n'est pas à jour, @params a changé et est devenu params tout court
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  5. #5
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    merci ça fonctionne.....
    enfin pour cette partie là....
    parce que quand j'essaies d'appeler la méthode ajoutCommentaire (avec les bons paramètres) et bien j'ai une erreur 500 - Internal Server Error...
    quel genre d'erreur peut causer cette page ?
    merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  6. #6
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    j'ai trouvé (enfin je pense) mon erreur : lors du submit de mon form l'adresse n'est pas formatée selon les exigences de rails.....
    dans mon tuto pour le form il est utilisé quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <%= start_form_tag :action => ajoutCommentaire %>
    ...
    <%= end_form_tag %>
    mais lorsque j'utilise cette méthode j'ai une erreur undefined method start_form_tag
    j'ai donc remplacé cette méthode par un form html simple : <form action="ajoutCommentaire"></form>
    ça fonctionne pour l'ajout d'article pourtant....
    quelqu'un aurait une idée soit pour forcer le format du passage de paramètres (c'est à dire ajoutCommentaire/tire/auteur/ ....) soit pour la nouvelle version start_form_tag svp??
    merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    start_form_tag/end_form_tag ont été remplacés par form_tag :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <% form_tag(options) do %>
    ...
    <% end %>
    Essayes de trouver un tuto plus à jour

    Et interesse toi à l'architecture restful dès que tu te sentiras un peu plus à l'aise, tu as tout à y gagner
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  8. #8
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    ok merci mais cela ne change rien : j'ai toujours mon internal server error.... :s
    voici le code de ma vue (présentation basique mais je préfère me concentrer sur le fonctionnement afin de mieux comprendre...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <h2><p><%= link_to "retour", :action => "listeArticle" %></p></h2>
    <h2><p><%= @article.titre %></p></h2>
    <div class="contenu">
        <%= @article.contenu %>
    </div>
    <h2>Commentaires</h2>
    <%
        @article.commentaire.each do |commentaire|
    %>
    <div class="commentaire">
        par <%= commentaire.auteur + " le " + commentaire.created_at.strftime("%d/%m/%Y") %>
    </div>
    <%= commentaire.contenu %>
    <% end %>
    <h2>Ajouter un commentaire</h2>
    <% form_tag "ajoutCommentaire" do %>
        <%= hidden_field_tag "articleid", @article.id %>
        <p>Auteur : <%= text_field_tag "commentaire", "auteur" %></p>
        <p>Note article : <%= select "commentaire", "note", @notes  %></p>
        <p>Contenu : <%= text_area "commentaire", "contenu" %></p>
        <%= submit_tag("Ajouter") %>
    <% end %>
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  9. #9
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    salut,

    Quand j'utilise des formulaires j'utilise ce tag ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <% form_tag( :action => :nom_du_def ) do %>
    ...
    <% end %>
    a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <%
        @article.commentaire.each do |commentaire|
    %>
    j'utilise plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <% for i in @liste -%>
    i.get_qqchose
    ...
    <% end %>
    24 hours a day ... never enough

  10. #10
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    merci pour la précision sur le formulaire j'ai mieux compris....
    cependant je n'ai pas bien compris ton itération.... enfin le for je connais c'est son application ici que je n'ai pas compris...
    peux-tu, si cela ne te déranges pas bien sûr, reprendre mon exemple avec ta boucle stp ?
    merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  11. #11
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    j'ai résolu mon erreur : j'avais un text_field_tag au lieu de text_field tout simplement....
    du coup un paramètre ne passait pas et erreur lors de l'insertion dans la base de données car le champ interdit la valeur nulle (ce qui est fait exprès)....
    j'ai remplacé et ça fonctionne parfaitement !!
    merci à tous de vos réponses !!
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  12. #12
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    par contre pour le moment je suis obligé d'accéder à mon site par une URL de cette forme :
    localhost:3000/monsite/méthode
    y aurait-il moyen de définir que lorsque l'URL est de cette forme :
    localhost:3000/monsite/
    c'est la méthode listeArticle (par exemple) qui est appelée ?
    merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  13. #13
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    salut,

    Normalement, si tu n'indique aucune méthode dans l'url, c'est la méthode 'index' qui est chargée par défaut

    Si tu as une méthode 'index' dans ton controller 'monsite', rien ne t'empêche à mon sens d'appeler la méthode désirée à partir de là, ou de rediriger l'utilisateur vers la méthode de ton choix

    ex. de redirection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Controller monsite < ...
     
    def index
       redirect_to :action => def_name (dans le controller)
       redirect_to :controller => c_name, :action => a_name (dans un controller externe)
    end
     
    end #controller
    aura pour effet de rediriger l'utilisateur vers def_name au lieu d'afficher la page index
    24 hours a day ... never enough

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <%
        @article.commentaire.each do |commentaire|
    %>
    j'utilise plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <% for i in @liste -%>
    i.get_qqchose
    ...
    <% end %>
    Note que les deux sont *strictement* identiques, puisque for ... in fait appel à la méthode each. C'est vraiment une question de goût, personnellement je préfère la première méthode qui est à mon sens plus explicite (on voit bien qu'on appelle la méthode each en passant un bloc).


    par contre pour le moment je suis obligé d'accéder à mon site par une URL de cette forme :
    localhost:3000/monsite/méthode
    y aurait-il moyen de définir que lorsque l'URL est de cette forme :
    localhost:3000/monsite/
    Définir la méthode index est effectivement une méthode, une autre consiste à définir une route :
    Code config/routes.rb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    map.connect '/monsite', :controller => 'monsite', :action => 'ajoutCommentaire'

    Un dernier point, quand tu parles d'erreur 500 : normalement en environnement de développement Rails affiche l'erreur exact avec un backtrace pour voir exactement où elle à eu lieu. Si tu as juste une page rouge qui marque "We're sorry, but something went wrong", ce n'est pas normal (en principe ça n'arrive pas en dév mais certain ont déjà eu le problème je crois)
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  15. #15
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    Définir la méthode index est effectivement une méthode, une autre consiste à définir une route
    On en apprend tous les jours
    24 hours a day ... never enough

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. You have a nil object when you didn't expect it!
    Par horkets dans le forum Ruby on Rails
    Réponses: 3
    Dernier message: 29/07/2008, 15h14
  2. Réponses: 1
    Dernier message: 25/05/2008, 23h07
  3. terminal you have new mail
    Par Palcolor dans le forum BSD
    Réponses: 1
    Dernier message: 09/05/2008, 09h14
  4. You have an error in your SQL syntax; check the manual ..
    Par Spaccio dans le forum Requêtes
    Réponses: 5
    Dernier message: 09/07/2006, 17h39
  5. Réponses: 5
    Dernier message: 10/05/2005, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo