发表评论时显示用户名

时间:2014-08-27 02:08:24

标签: ruby-on-rails ruby-on-rails-4 nomethoderror

我希望能够显示对帖子发表评论的人的用户名。我在显示它时遇到了一些困难。正如代码现在所说的那样,我得到一个未定义的方法`user' for 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*

查看/ _comments

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

4 个答案:

答案 0 :(得分:1)

在您的评论控制器中,您的创建方法应该如下所示:

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

如果有帮助,请告诉我

答案 1 :(得分:0)

<%= @comment.user.name %>应该是<%= comment.user.name %>@之前没有comment),因为该视图/部分在该点使用局部变量,而不是实例变量。< / p>

只是提示您的问题:您应该为视图片段提供更多上下文。它是全视图,视图的一部分还是部分视图?它的文件名/它映射到哪个控制器操作是什么?如果它是部分的,那么它是从哪个视图呈现的?

答案 2 :(得分:0)

使用Rails / REST约定,show动作负责呈现特定资源实例的表示。为此,它需要来自params的id,通过id查找资源实例,并呈现响应。您的show动作应加载现有注释,而不是创建新注释。新评论不会分配用户,这就是您在nil对象上调用方法时出错的原因 - 尚未设置新评论的用户。

在您的演出动作中尝试以下操作:

@commment = Comment.find params[:id]

答案 3 :(得分:0)

我能够解决这个问题。 &lt;%= current_user.name%&gt;需要在我的_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