为什么我看到未定义的方法`评论'为零:NilClass?我需要一些见解

时间:2015-02-28 01:39:19

标签: ruby-on-rails comments posts

我想让用户在用户帖子上发表评论。我有这个在show.html.erb,

<div id="comments">
    <%= render @posts.comments %>

        <h3>Add a Comment</h3>
            <%=  render "comments/form" %>          
</div>

我在comments_controller.rb中有这个,

class CommentsController < ApplicationController
 def new
  @post = Post.new(params[:post])
  @user = User.find(session[:user_id])
 end
 def create 
    @post = Post.find(params[:post_id])
    @comment = @post.comments.build(params[:comment])
    @comment.save
    redirect_to @post
 end
 def destroy
     @user = User.find(session[:user_id])
     @posts = Post.find(params[:post_id])
     @comment = @post.comments.find(params[:id])
     @comment.destroy

     redirect_to post_path(@post)
 end
 private
 def comment_params
   params.require(:comment).permit(:name, :text)
 end
  end

这是我的posts_controller.rb

class PostsController < ApplicationController
def index
    @user = User.find(session[:user_id])
    @posts = Post.all
end
def welcome
    @user = User.find(session[:user_id])
    @post = Post.find(params[:id])
    @posts = Post.order("created_at desc").limit(4).offset(1)
    @signed_in_user = session[:user_id]
end
def posts
    @user = User.find(session[:user_id]) unless session[:user_id] == nil
    @post = Post.find(params[:id])
    redirect_to login_path, notice: "You're not logged in" unless @user 
end
def new 
    @post = Post.new
    @user = User.find(session[:user_id])
end
def create 
    @user = User.find(session[:user_id])        
    @post = Post.new(post_params)

    @post.user_id = @signed_in_user

if  @post.save 
    redirect_to dashboard_path 
else
    render 'new'
end
end
def show
    @user = User.find(session[:user_id])
    @post = Post.find(params[:id])
    @posts = Post.order("created_at desc").limit(4).offset(1)
    @signed_in_user = session[:user_id]
end
def edit
    @user = User.find(session[:user_id])
    @post = Post.find(params[:id])
end 

def update
    @user = User.find(session[:user_id])
    @post = Post.find(params[:id])

    if @post.update(params[:post].permit(:body))
    redirect_to @post
    else
        render 'edit'
    end
end
def destroy
    @user = User.find(session[:user_id])

    @post = Post.find(params[:id])
    @post.user_id = @signed_in_user

    @post.destroy

    redirect_to posts_path
 end

 private
    def post_params
        params.require(:post).permit(:body)
    end
    end

这是在我的_form.html.erb

<%= form_for([@post, @post.comments.build]) do |f| %>
    <p>
        <%= f.label :name %><br>
        <%= f.text_field :name %>
    </p>
    <p>
        <%= f.label :body %><br>
        <%= f.text_area :body %>
    </p>
    <br>
 <p>
    <%= f.submit %>
 </p>
<% end %>

编辑:这是我的路线!

 post_comments GET    /posts/:post_id/comments(.:format)  

 POST   /posts/:post_id/comments(.:format)  

 /posts/:post_id/comments/new(.:format) 

 /posts/:post_id/comments/:id/edit(.:format) 

  post_comment GET    /posts/:post_id/comments/:id(.:format)  

  PATCH  /posts/:post_id/comments/:id(.:format) 

  PUT    /posts/:post_id/comments/:id(.:format) 

  DELETE /posts/:post_id/comments/:id(.:format) 
  posts GET    /posts(.:format) posts#index

  POST   /posts(.:format)

  new_post GET    /posts/new(.:format)   posts#new
   edit_post GET    /posts/:id/edit(.:format)  posts#edit
      post GET    /posts/:id(.:format) posts#show
           PATCH  /posts/:id(.:format) posts#updat

           PUT    /posts/:id(.:format)  posts#updat

我已经看了好几个小时但似乎无法弄明白。它让我疯狂,如果我能够了解它可能是多么伟大的东西!非常感谢您的任何建议,这意味着很多!另外,如果我需要发布更多代码,那么你可以看到让我知道!我做了编辑!

1 个答案:

答案 0 :(得分:0)

您在空/非初始化变量上调用.comments,这就是异常告诉您的。在没有看到错误堆栈跟踪的情况下,我在您show.html.erb调用render @posts.comments的那一行打赌。

根据您的控制器,将render @posts.comments移至render @post.comments,该Post应包含一个comments对象,可以访问它@posts集合。我仍然不确定为什么nilActiveRecord::Relation,因为您在控制器上将其初始化为Post#comments ...但无论如何您仍然希望访问关于那一点的@post(因此,{{1}})。