我正试图让用户在用户帖子上发表评论。我有这个在show.html.erb,
<div id="comments">
<%= render @posts.comments %>
<h3>Add a Comment</h3>
<%= render "comments/form" %>
</div>
我在我的评论中有这个_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
这是在我的post_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
我已经查了好几个小时了,但似乎找不出来。它让我抓狂,如果我能深入了解它可能是什么,那就太好了!谢谢你提前给我的建议,这意义重大!此外,如果我需要发布更多的代码,这样你就可以看到,让我知道!我会进行编辑!
您正在对一个空/未初始化的变量调用.comments
,这就是Exception告诉您的。在没有看到错误stacktrace的情况下,我的赌注转到show.html.erb
上的那一行,在那里您调用render @posts.comments
。
根据您的控制器,将render @posts.comments
移动到render @post.comments
,其中应该包含一个可以访问其comments
集合的Post
对象。我仍然不确定为什么@posts
是nil
,因为您正在控制器上将其初始化为ActiveRecord::Relation
。。。但无论如何,您仍然希望访问该位上的Post#comments
(因此是@post
)。