2017-07-24 1 views
-1

Nach der Anmeldung ich eine Aktions-Controller Ausnahme erhalten:current_user als null nach dem Login wirft NoMethodError

NoMethodError in StaticPages # Hause
nicht definierte Methode 'E-Mail' für nil: NilClass

Was gilt nil ist current_user in Zeile 12 des Teil folgenden _comment.html.erb:

<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> 

Die E-Mail der Ausnahme ist die E-Mail in der Definition von gravatar_for.
Wenn ich die 12. Zeile entfernen, ist die Ausnahme ausgelöst undefined Methode 'Antworten' für Nil: NilClass, das ist current_user in der folgenden Zeile.
Der obige Teil wird in den Mikropartisteil als <%= render comment %> eingefügt. Ich habe versucht, den Code direkt in der Mikroparte Teil hinzuzufügen, aber die Ausnahme wird trotzdem ausgelöst.

Der Code, der die Ausnahme auslöst, gehört zur Antwortfunktion: Ein Benutzer kann eine Mikropost, einen Kommentar zu einer Mikropost und eine Antwort auf einen Kommentar veröffentlichen.

Ich verstehe nicht, warum current_user gilt als Null nach dem Login.
current_user wird in der Sitzung Helfer wie folgt definiert:

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 

zwei Linien über den bedingten, if logged_in? überprüft, dass current_user einfach nicht Null sein, da Verfahren logged_in? Außerdem als !current_user.nil? definiert ist, wird current_user viele Male genannt in der Micropart Partial, in dem der Kommentar partial eingefügt wird, aber rails beginnt an diesem Punkt die Ausnahme auszulösen.

Antwort

1

In Ihrem Zustand:

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

Sie zuweisen current_user anstatt es zu prüfen, die das Problem verursacht:

current_user = comment.micropost.user 

sollte es == statt = sein und die comment.micropost.user ist gleich Null denen zugewiesen zu current_user und es wirft Sie Ausnahme.

1

Sie haben einen Fehler hier:

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

Sie zuweisen comment.micropost.user zu current_user statt dessen Wert zu vergleichen.

Also, wenn dieser Punkt erreicht, erhalten Sie einen Fehler, da current_user Wert mit einem beliebigen Wert gesetzt wird Sie in comment.micropost.user hatte, und da es keine gültige id ist Sie nil von current_user bekommen.

das Problem einfach zu lösen = ändern ==:

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