Rails 5.2提交评论触发ActionController::ParameterMissing错误求助
兄弟,我瞅了下你的代码,立马就找到几个导致这个参数缺失错误的关键问题,咱们一步步来搞定:
问题根源
你收到的 ActionController::ParameterMissing at /posts param is missing or the value is empty: post 错误,核心原因是表单提交到了错误的控制器:
你当前的表单指定了 url: post_path,这个路径会把请求发到 PostsController 的动作,但你实际是要提交评论到 CommentsController 的 create 方法。而 PostsController 的 post_params 强制要求 :post 参数,可表单里传的是评论相关的参数,自然就触发了参数缺失的报错。
具体修复步骤
1. 修正路由:设置嵌套资源
评论是帖子的关联资源,必须用嵌套路由才能正确传递 post_id 参数。修改 config/routes.rb:
Rails.application.routes.draw do resources :posts do resources :comments # 将comments嵌套在posts下,生成关联路由 end root 'home#index' end
这样会生成 POST /posts/:post_id/comments 这类正确的嵌套路由,自动把 post_id 传递给 CommentsController。
2. 修复表单的提交路径与字段
你的表单有两个小问题:提交路径错误、标签与输入字段不匹配。修改视图代码:
<h1>My post</h1> <p><%= @post.title%></p> <p><%= @post.text%></p> <h2>Add a comment</h2> <%= form_with(model: [@post, @post.comments.build], local: true) do |form|%> <p> <%= form.label :commenter%><br> <!-- 之前错写成了:body,现在修正 --> <%= form.text_field :commenter%> </p> <p> <%= form.label :body%> <%= form.text_area :body%> </p> <p> <%= form.submit%> </p> <% end%> <p><%= link_to "edit", edit_post_path(@post) %></p> <!-- 这里要传入@post参数,否则会报错 -->
这里去掉了手动指定的 url: post_path,因为用 model: [@post, @post.comments.build] 这种嵌套模型写法,Rails会自动生成正确的嵌套路由路径,不用手动指定URL。另外修正了第一个标签的错误,还补全了编辑链接的参数。
3. 确认CommentsController的参数处理
你的 CommentsController 代码是没问题的,comment_params 正确要求 :comment 参数并允许 commenter 和 body 字段,这部分不用修改。
测试验证
重启Rails服务器,回到帖子详情页提交评论,应该就能正常保存,不会再出现参数缺失的错误了。
内容的提问来源于stack exchange,提问作者loba

