【问题标题】:Why am I seeing undefined method `comments' for nil:NilClass? I need some insight为什么我看到 nil:NilClass 的未定义方法“注释”?我需要一些见解
【发布时间】:2015-04-30 21:01:09
【问题描述】:

我试图让用户在用户帖子上发布 cmets。我有这个在 show.html.erb,

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

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

我的 cmets_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

我已经找了好几个小时了,但似乎无法弄清楚。它让我发疯,如果我能对它可能是什么有所了解,那就太好了!提前感谢您的任何建议,这意味着很多!另外,如果我需要发布更多代码以便您看到,请告诉我!生病编辑!

【问题讨论】:

  • 必须是@post.comments ?
  • 不,这不起作用。
  • 请在此操作失败时发布您的堆栈跟踪。我想知道您为什么在涵盖其余文件时忽略了它。
  • 我认为帖子应该是用户的嵌套属性,你可以上传两个模型吗?

标签: ruby-on-rails comments posts


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 2014-04-03
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多