1

我正在为我在 Rails 中创建的博客添加评论。

尝试提交评论时,我不断收到此错误“找不到没有 ID 的帖子”。

Rails 显示了这一点:

{"utf8"=>"✓",
 "authenticity_token"=>"KOsfCNHJHo3FJMIBX6KNCV2qdyoYV6n5Rb3MNbhTX3M=",
 "comment"=>{"comment"=>"work dammit",
 "post_id"=>"post"},
 "commit"=>"Post"}

这是评论控制器

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

我意识到我可能两次做同样的事情。我也愚蠢地调用了comments评论的内容,并且当我将其更改为内容时似乎得到了更多的错误。

我可能弄坏了很多东西。

4

1 回答 1

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

您也可以通过在表单中​​指定 post ID 值来解决此问题,如果您更愿意这样做而不是在控制器中构建它:

 <%= f.hidden_field :post_id, @post.id %>

这会将 post_id 插入到隐藏字段中,因此它实际上发送了正确的值。

然后在您的 CommentsController 中,您需要从该 ID 加载帖子。这将是:

@post = Post.find params[:comment][:post_id]

在上面显示的情况下。

但是,使用嵌套资源会更聪明,因此您可以从 URL 免费获取 post_id。请参阅Rails 指南

对于这些基本问题,我建议您从根本上理解 Rails 框架中发生的事情。值得您花时间阅读Rails for ZombiesRails 教程。深入研究并花时间真正了解 REST 的含义以及应用程序如何通过响应请求来加载页面将非常值得您花时间。

于 2013-05-12T00:02:53.840 回答