Показывать имя пользователя при публикации комментариев

Я хотел бы иметь возможность отображать имя пользователя человека, который прокомментировал сообщение. У меня есть некоторые трудности с отображением этого. Как сейчас выглядит код, я получаю неопределенный метод `user' для nil:NilClass в представлении для строки: ‹%= @comment.user.name %>. Заранее еще раз спасибо.

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

class CommentsController < ApplicationController
  before_filter :authenticate_user!

  def new
  @post = Post.find(params[:post_id])
  @comment = Comment.new
  end


  def create
    @post = Post.find_by_id(params[:post_id])
    @comment = @post.comments.create(params.require(:comment).permit(:commenter, :body))
    @comment.user = current_user

    respond_to do |format|
      if @comment.save
        format.html { redirect_to @post, notice: 'Comment was successfully created.' }
        format.json { render json: @comment, status: :created, location: @comment }
      else
        format.html { render action: "new" }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end

  end

def destroy
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:id])
    @comment.destroy
    redirect_to post_path(@post)
end

def show
  @comment = Comment.new
end


private
  def comment_params
    params.require(:comments).permit(:commenter, :body)
  end

end*

Просмотр/_комментарии

<%= div_for(comment) do %>
    <p>
        <strong>Posted <%= time_ago_in_words(comment.created_at) %> ago</strong></br>
        <%= h(comment.body) %>
        <%= @comment.user.name %>
        <%= link_to 'Delete', [@post, comment], :method => :delete, :confirm => "Are you sure?" %>
    </p>
<% end %>

Модель пользователя

has_many :comments

Модель комментариев

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

person Annette    schedule 27.08.2014    source источник


Ответы (4)


В вашем контроллере комментариев ваш метод создания должен выглядеть так:

def create
@comment = current_user.comments.new(comment_params)

respond_to do |format|
  if @comment.save
    format.html { redirect_to @comment, notice: 'Comment was successfully created.' }
    format.json { render :show, status: :created, location: @comment }
  else
    format.html { render :new }
    format.json { render json: @comment.errors, status: :unprocessable_entity }
  end
 end
end

Затем в вашем файле view/_comments должно быть что-то вроде этого:

 Added:<%= time_ago_in_words(comment.created_at) %> ago<br>
 Added by: <%= current_user.email  %>

Позвольте мне знать, если это помогает

person Joel    schedule 27.08.2014
comment
JoelL, да, я использую Devise. Знаете ли вы, как я могу отобразить имя пользователя, опубликовавшего комментарий? Прямо сейчас он отображает пользователя, который в данный момент вошел в систему. Спасибо. - person Annette; 28.08.2014
comment
Спасибо за ответ. К сожалению, это по-прежнему показывает только текущую электронную почту пользователей. Не фактическое лицо, которое разместило это. Например, если я отправлю комментарий, мое имя будет указано там. Однако, если я выйду из системы и войду как кто-то другой, скажем, Эбби. Тогда ее электронная почта будет отображаться под тем же комментарием вместо моего. Надеюсь, это имеет смысл. - person Annette; 28.08.2014

Согласно соглашению Rails/REST действие show отвечает за рендеринг представления конкретного экземпляра ресурса. Для этого он берет идентификатор из параметров, ищет экземпляр ресурса по идентификатору и отображает ответ. Ваше действие show должно загружать существующий комментарий, а не создавать новый комментарий. Новому комментарию не будет назначен пользователь, поэтому вы получаете сообщение об ошибке при вызове метода для нулевого объекта — пользователь для нового комментария не был установлен.

В действии show попробуйте следующее:

@commment = Comment.find params[:id]
person Puhlze    schedule 27.08.2014

<%= @comment.user.name %> должно быть <%= comment.user.name %> (без @ перед comment), потому что это представление/частично использует локальную переменную в этой точке, а не переменную экземпляра.

Просто совет по вашему вопросу: вы должны дать немного больше контекста для фрагмента просмотра. Это полное представление, часть представления или частичное? Какое у него имя файла/на какое действие контроллера он сопоставляется? Если это частичное представление, из какого представления оно отображается?

person Inkling    schedule 27.08.2014
comment
Спасибо за указатели. Я обновлю свой пост. Когда я меняю его на ‹%= comment.user.name %›, я получаю 'имя метода' для nil:NilClass'. - person Annette; 27.08.2014

Я смог решить это. ‹%= current_user.name %> должен быть в моем представлении _comment, и я удалил @comment.user = current_user из моего контроллера комментариев. Спасибо за вашу помощь.

Просмотр / _comments.html

<%= div_for(comment) do %>
    <p>
        <strong>Posted <%= time_ago_in_words(comment.created_at) %> ago</strong></br>
        <%= h(comment.body) %>
        <%= current_user.name %>
        <%= link_to 'Delete', [@post, comment], :method => :delete, :confirm => "Are you sure?" %>
    </p>
<% end %>

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

class CommentsController < ApplicationController
  before_filter :authenticate_user!

  def new
  @post = Post.find(params[:post_id])
  @comment = Comment.new
  end


  def create
    @post = Post.find_by_id(params[:post_id])
    @comment = @post.comments.create(params.require(:comment).permit(:commenter, :body))

    respond_to do |format|
      if @comment.save
        format.html { redirect_to @post, notice: 'Comment was successfully created.' }
        format.json { render json: @comment, status: :created, location: @comment }
      else
        format.html { render action: "new" }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end

  end

def destroy
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:id])
    @comment.destroy
    redirect_to post_path(@post)
end

def show
  @commment = Comment.find params[:id]
end
person Annette    schedule 27.08.2014