Неопределенный метод, аватар и имя для nil:NilClass

неопределенный метод avatar?' for nil:NilClass undefined methodname' для nil:NilClass

Привет, я получаю следующие ошибки в моем частичном. Причина, по которой я перечислил обе, заключается в том, что после комментирования строки, вызывающей первое сообщение об ошибке, я получаю вторую ошибку, которая заставляет меня поверить, что проблема не в «аватаре» или «имени», а в чем-то еще, хотя я не знаю что. В консоли rails я могу вызвать пользователя и имя в комментарии. Я также заполнил базу данных с помощью Faker, если это имеет значение. Вот частичное.

<%= content_tag :div, class: 'media', id: "comment-#{comment.id}" do %>
  <%= link_to '#', class: 'pull-left' do %>
    <%= image_tag(comment.user.avatar.small.url) if comment.user.avatar?  %>
  <% end %>
  <div class="media-body">
    <small>
      <%= comment.user.name %> commented <%= time_ago_in_words(comment.created_at) %> ago
      <% if policy(comment).destroy? %>
        | <%= link_to "Delete", [@topic, @post, comment], method: :delete %>
      <% end %>
    </small>
    <p><%= comment.body %></p>
  </div>
<% end %>

Также обратите внимание на рендер.

  <div class="col-md-4">
    <% if policy(Comment.new).create? %>
      <h4>Leave a comment</h4>
      <br/>
      <%= render partial: 'comments/comment', locals: { topic: @topic, post: @post, comment: @comment } %>
    <% end %>
</div>

Ниже приведены моя пользовательская модель и comment_controller.

class UsersController < ApplicationController
  before_filter :authenticate_user!

  def update
    if current_user.update_attributes(user_params)
      flash[:notice] = "User information updated"
      redirect_to edit_user_registration_path(current_user)
    else
      render "devise/registrations/edit"
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :avatar)
  end
end

Комментарии_контроллер

  def create
    @topic = Topic.find(params[:topic_id])
    @post = @topic.posts.find(params[:post_id])
    @comments = @post.comments

    @comment = current_user.comments.build(comment_params)
    @comment.post = @post
    @new_comment = Comment.new

    authorize @comment
    if @comment.save
      redirect_to [@topic, @post], notice: "Comment was submitted successfully."
    else
      flash[:error] = "There was an error submitting the comment. Please try again."
    end
  end

Я уже сбросил базу данных, но безрезультатно. Запутался в чем дело. Спасибо за вашу помощь.

Пожалуйста, смотрите ниже мои модели пользователей и комментариев.

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :user

  default_scope { order('created_at DESC') }

  validates :body, length: { minimum: 5 }, presence: true

  after_create :send_favorite_emails

  private

  def send_favorite_emails
    self.post.favorites.each do |favorite|
      if favorite.user_id != self.user_id && favorite.user.email_favorites?
        FavoriteMailer.new_comment(favorite.user, self.post, self).deliver
      end
    end
  end
end

Пользовательская модель

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  has_many :posts
  has_many :comments
  has_many :votes, dependent: :destroy
  has_many :favorites, dependent: :destroy
  mount_uploader :avatar, AvatarUploader

  def role?(base_role)
    role == base_role.to_s
  end

  def favorited(post)
    self.favorites.where(post_id: post.id).first
  end

  def voted(post)
    self.votes.where(post_id: post.id).first
  end

  private
end

person user3465296    schedule 26.03.2014    source источник
comment
Ошибки nil:NilClass обычно возникают из-за того, что вы либо вызываете необработанную переменную либо, используемая вами переменная содержит nil данных внутри   -  person Richard Peck    schedule 26.03.2014
comment
Можете ли вы показать нам свои модели User и Comment?   -  person Richard Peck    schedule 26.03.2014
comment
пользователь не настроен на комментарий, это то, что он говорит. Почему? Ну это где-то вверх по течению. Вокруг current_user.comments.build(comment_params) я бы искал.   -  person Tony Hopkinson    schedule 26.03.2014
comment
Подождите, как comment устанавливается в вашем представлении, если вы устанавливаете @comment в контроллере? Разве вы не должны использовать @comment?   -  person Jonathan Allard    schedule 26.03.2014
comment
@RichPeck - я добавил комментарий и пользовательские модели. Я подозревал, что проблема была в том, для чего вызывался метод, но, как я писал выше, в консоли rails все комментарии имеют user_id. К тому же, я новичок, поэтому не знаю, что еще искать.   -  person user3465296    schedule 27.03.2014
comment
Не могли бы вы добавить комментарии к разрешенным параметрам? Возможно, проблема в том, что разрешенные параметры в комментарии пропускают user_id. Попробуйте явно добавить user_id в разрешенные значения в контроллере комментариев, перезапустите сервер и отбросьте создание начального числа миграции, а затем попробуйте еще раз.   -  person Thresh    schedule 27.03.2014


Ответы (2)


Если вы получаете

неопределенный метод foo для nil:NilClass

дело в том, что вы вызываете свой метод nil.

Итак, в вашем случае вы вызываете avatar? и name на что-то ноль.

Глядя на ваш код, становится ясно, что comment.user - это (а) то, для чего вызываются эти методы, и, следовательно, (б) то, что равно нулю.

Результат: у вашего комментария нет пользователя. Либо заставьте все комментарии (включая новые/пустые/заглушки) иметь пользователя (пустого пользователя?), либо сделайте свое представление таким, чтобы пользователь не был необходим.

person Jonathan Allard    schedule 26.03.2014
comment
Я добавил комментарий и пользовательские модели. Я подозревал, что проблема была в том, для чего вызывался метод, но, как я писал выше, в консоли rails все комментарии имеют user_id. К тому же, я новичок, поэтому не знаю, что еще искать. - person user3465296; 27.03.2014
comment
@user3465296 В вашей ситуации я бы использовал pry (gem pry-rails) и вставил <% binding.pry %> в ваш просмотр непосредственно перед исключением. - person Jonathan Allard; 27.03.2014

Проблема была обнаружена. В частичном рендере

comment: @comment

должно быть

comment: comment
person user3465296    schedule 31.03.2014