首页 > 解决方案 > /posts 处的 ActionController::ParameterMissing 参数丢失或值为空:在 Rails 5.2 上发布

问题描述

我面临参数参数的问题。我正在遵循 rails 指南以便在我的应用程序中实现评论,但是当我尝试发表评论时,我收到了错误:

ActionController::ParameterMissing at /posts param is missing or the value is empty: post

这是控制器中将引发错误的代码

def post_params
    params.require(:post).permit(:title, :text).tap do |post_params|
        post_params.require(:title, :text)
    end
end

这是链接到 post_params 方法的 create 方法

def create
    @post = Post.new(post_params)
    if  @post.save
        redirect_to @post
    else
        render 'new' 
    end   
end

这是我调用 form_with 的视图

<h1>My post</h1>

<p><%= @post.title%></p>
<p><%= @post.text%></p> 
<h2>Add a comment</h2>
<%= form_with(model: [@post, @post.comments.build], url: post_path, local: true) do |form|%>
    <p>
        <%= form.label :body%><br>
        <%= 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 %></p>

评论控制器:

class CommentsController < ApplicationController
    def create
        @post = Post.find(params[:post_id])
        @comment = @post.comments.create(comment_params)
        redirect_to post_path(@post)
    end

    private 

    def comment_params
        params.require(:comment).permit(:commenter, :body)
    end
end

路线.rb

Rails.application.routes.draw do
  resources :posts
  resources :comments
  root 'home#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

标签: ruby-on-railsrubyruby-on-rails-5

解决方案


url: post_path您的form_with.

form_with将能够正确地路由表单[@post, @post.comments.build]。这应该路由到post_comments_path,但您将其覆盖到post_path。提交表单时posts#create正在调用,并且 由于params 对象params.require(:post)中没有键而引发错误。post

应按预期工作的post_comments_path遗嘱路由。comments#create您可以添加url: post_comments_path为显式。

更新:

NoMethodError是由于缺少嵌套路由造成的。目前,评论的路由基于/comments/:id路由和生成comment_path助手。

我们可以使用嵌套路由来更好地定义我们的关系并使我们的控制器动作更加简洁。我们要更新routes.rb为:

(您还应该在路由文件的顶部有您的根路由)

Rails.application.routes.draw do
  root 'home#index'

  resources :posts do
    resources :comments
  end
end

由于评论嵌套在帖子块中,Rails 将创建类似于posts/:post_id/comments/:comment_id和的嵌套路由post_comments_path


推荐阅读