2017-07-24 1 views
-1

Après connexion, je reçois un contrôleur d'action Exception:current_user considéré comme nul après la connexion soulève NoMethodError

NoMethodError dans StaticPages # maison
méthode non définie 'email' pour nil: NilClass

Ce qui est considéré nil est current_user à la ligne 12 de ce qui suit _comment.html.erb partielle:

<li id="comment-<%= comment.id %>"> 
    <%= link_to gravatar_for(comment.user, size: 30), comment.user %> 
    <span class="comment-content"><%= link_to comment.user.name, comment.user %>&nbsp;<%= comment.content %></span> 
    <span class="timestamp"> 
     Posted <%= time_ago_in_words(comment.created_at) %> ago. 
     <% if current_user?(comment.user) %> 
      <%= link_to "delete", comment, method: :delete, remote: true %> 
     <% end %> 
    </span> 
    <% if logged_in? && (current_user == comment.user || current_user = comment.micropost.user) %> 
     <div class="reply-section"> 
      <%= link_to gravatar_for(current_user, size: 20), current_user %> 
      <%= form_for(current_user.replies.build) do |f| %> 
       <%= render 'shared/error_messages', object: f.object %> 
       <div><%= f.hidden_field :comment_id, value: comment.id %></div> 
       <div class="reply-box"> 
        <%= f.text_area :content, rows: "1", class: "reply_area" %> 
       </div> 
       <%= f.submit "Reply", class: "btn btn-primary btn-xs" %> 
      <% end %> 
     </div> 
    <% end %> 
    <div class="replies-section"> 
     <% if comment.replies.any? %> 
      <ol id="replies_comment-<%= comment.id %>"> 
       <% comment.replies.each do |reply| %> 
        <%= render reply %> 
       <% end %> 
      </ol> 
     <% end %> 
    </div> 
</li> 

L'e-mail de l'exception est l'e-mail dans la définition de gravatar_for.
Si je supprime la 12ème ligne, l'exception déclenchée est la méthode non définie 'répond' pour la ligne: NilClass, soit current_user dans la ligne suivante.
Le partiel ci-dessus est inséré dans le micropost partiel sous la forme <%= render comment %>. J'ai essayé d'ajouter le code directement dans le micropost partiel mais l'exception est levée de toute façon.

Le code qui déclenche l'exception appartient à la fonction de réponse: un utilisateur peut publier un microposte, un commentaire sur un microposte et une réponse à un commentaire.

Je ne comprends pas pourquoi current_user est considéré comme nul après la connexion.
current_user est défini dans l'assistant de session comme suit:

def current_user 
    if (user_id = session[:user_id]) 
     @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id]) 
     user = User.find_by(id: user_id) 
     if user && user.authenticated?(:remember, cookies[:remember_token]) 
      log_in user 
      @current_user = user 
     end 
    end 
end 

Deux lignes au-dessus du conditionnel, if logged_in? vérifie juste que current_user ne soient pas nuls, puisque la méthode logged_in? est définie comme !current_user.nil? De plus, current_user est appelé beaucoup de fois la partie micropost partielle, où le commentaire partial est inséré, mais les rails commencent à lever l'exception à ce point.

Répondre

1

Dans votre état:

<% if logged_in? && (current_user == comment.user || current_user = comment.micropost.user) %> 

Vous assignez current_user au lieu de vérifier ce qui est l'origine du problème:

current_user = comment.micropost.user 

Il devrait y avoir == au lieu de = et comment.micropost.user est nulle qui est attribué à current_user et il vous lance une exception.

1

Vous avez une erreur ici:

<% if logged_in? && (current_user == comment.user || current_user = comment.micropost.user) %> 

Vous assignez comment.micropost.user à current_user au lieu de comparer sa valeur.

Ainsi, en arrivant à ce moment-là, vous obtenez une erreur, car current_user valeur est définie avec toute valeur que vous aviez en comment.micropost.user et, puisqu'il n'est pas un id valide, vous obtenez nil de current_user.

Pour résoudre le problème Tout changement =-==:

<% if logged_in? && (current_user == comment.user || current_user == comment.micropost.user) %>