我正在为我在rails中创建的博客添加评论。
在尝试提交评论时,我一直收到此错误“无法找到没有ID的帖子”。
Rails表明了这一点:
{"utf8"=>"✓",
"authenticity_token"=>"KOsfCNHJHo3FJMIBX6KNCV2qdyoYV6n5Rb3MNbhTX3M=",
"comment"=>{"comment"=>"work dammit",
"post_id"=>"post"},
"commit"=>"Post"}
这是评论控制器
class CommentsController< ApplicationController中
def create
@post = Post.find(params[:id])
@comment = current_user.comments.build(params[:comment])
if @comment.save
redirect_to root_path
else
flash.now[:error] = "Your comment did not save!"
render '/blog'
end
end
def destroy
@comment = Comment.find(params[:id])
@comment.destroy
end
end
这是帖子控制器
def show
@post = Post.find(params[:id])
@comment = Comment.new(post_id: :post)
end
以下是评论表
<%= form_for @comment do |f| %>
<div class='comment'>
<%= f.text_area :comment, placeholder: "Leave a comment!", size: "40 x 3" %>
</div>
<%= f.hidden_field :post_id %>
<%= f.submit "Post", class: "button"%>
<% end %>
我意识到我可能两次做同样的事情。我还愚蠢地称之为评论评论的内容,并且当我将其更改为内容时似乎会出现更多错误。
我可能已经打破了很多东西。
答案 0 :(得分:2)
您未提交post_id
作为请求的一部分。你的参数错了:
{"utf8"=>"✓",
"authenticity_token"=>"KOsfCNHJHo3FJMIBX6KNCV2qdyoYV6n5Rb3MNbhTX3M=",
"comment"=>{"comment"=>"work dammit",
"post_id"=>THIS SHOULD BE A POST ID},
"commit"=>"Post"}
这是因为您在控制器中设置了错误的注释:
def show
@post = Post.find(params[:id])
# This is incorrect
# @comment = Comment.new(post_id: :post)
# This is correct
# @comment = Comment.new(:post => @post)
# This is better
@comment = @post.comments.build
end
您还可以通过在表单中指定帖子ID值来解决此问题,如果您愿意这样做而不是在控制器中构建它:
<%= f.hidden_field :post_id, @post.id %>
这会将post_id插入到隐藏字段中,因此它实际上会发送正确的值。
然后在您的CommentsController中,您需要从该ID加载帖子。这将是:
@post = Post.find params[:comment][:post_id]
如上所示,
但是,使用嵌套资源会更聪明,因此您可以从URL获取免费的post_id。请参阅the Rails Guide。
对于这些基本问题,我建议你对Rails框架中发生的事情进行基本的理解。值得您花时间浏览Rails for Zombies或Rails Tutorial。挖掘并花时间真正了解REST的含义以及应用程序如何通过响应请求来加载页面将非常值得您花时间。