【问题标题】:Rails: ActionController::ParameterMissing param is missing or the value is empty:Rails:ActionController::ParameterMissing 参数丢失或值为空:
【发布时间】:2016-01-19 03:23:07
【问题描述】:

我在尝试创建新列表时遇到以下错误,但我无法确定问题出在哪里。

ActionController::ParameterMissing in BusinessListingsController#create
param is missing or the value is empty: businesslisting

下面是business_listing_controller的代码:

class BusinessListingsController < ApplicationController
  def index
    @businesslistings = BusinessListing.all
  end

 def new
   @businesslisting = BusinessListing.new
 end

def create
  @businesslisting = BusinessListing.new(businesslisting_params)
  if @businesslisting.save
  redirect_to @businesslisting
 else
  render 'new'
 end
end

def show
  @businesslisting = BusinessListing.find(params[:id])
end

private 
  def businesslisting_params
    params.require(:businesslisting).permit(:title, :price, :city,    :industry)
  end
end 

查看/business_listing/:

<div class="row">
 <div class="col-md-6">
 <%= form_for(@businesslisting) do |f| %>

<%= f.label :title %>
<%= f.text_field :title %>

<%= f.label :price %>
<%= f.text_field :price %>

<%= f.label :city %>
<%= f.text_field :city %>

<%= f.label :industry %>
<%= f.text_field :industry %>

<%= f.submit "Create a Listing", class: "btn btn-primary" %>
<% end %>

谢谢!

【问题讨论】:

  • 您能否在创建操作期间粘贴在控制台上输出的参数跟踪?
  • 尝试重新启动服务器然后尝试

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

问题是您没有遵循 Rails 命名约定。您的类为BusinessListing,但您将实例变量和参数引用命名为businesslistingBusinessListing(驼峰式)本质上是两个字,在使用实例变量名时要匹配蛇形:business_listing

您的参数名称也是如此。 When you pass a model object into form_for,Rails 使用类名来确定参数名,所以我敢打赌遇到的实际参数是 business_listing,而不是 businesslisting

只需在整个代码中将所有出现的businesslisting 更改为business_listing(并将businesslistings 更改为business_listings),您就不会再遇到此问题了。

最重要的变化在这里:

params.require(:business_listing).permit(:title, :price, :city, :industry)

这本身应该可以解决您当前的问题,但我强烈建议您在整个代码中遵循约定以避免进一步的问题和混淆。

【讨论】:

  • 现在更有意义了。非常感谢!!
【解决方案2】:

我在 Ubuntu 20.04 中处理 Rails 6 API 时遇到了这个挑战。

我有一个 Schools 资源(控制器、模型和路由),我需要使用 Postman 创建一个学校。 Schools 资源有 2 个参数(名称和别名)。所以我使用 Params 部分来传递它,但我得到了错误:

app/controllers/schools_controller.rb:49:in `school_params'
app/controllers/schools_controller.rb:18:in `create'
Started POST "/schools" for ::1 at 2020-12-09 03:40:29 +0100
Processing by SchoolsController#create as */*
  Parameters: {"name"=>"The Prince School", "alias"=>"The Prince"}
Completed 400 Bad Request in 0ms (ActiveRecord: 0.0ms | Allocations: 122)
  
ActionController::ParameterMissing (param is missing or the value is empty: school):

这是我修复它的方法

根据我在SchoolsController 中的school_params,问题在于应用程序期待另一个名为school 的参数,它将封装其他参数:

def school_params
  params.require(:school).permit(:name, :alias)
end

解决方案 1

我在Header部分将Content-Type定义为application/json,然后将Postman的Body部分的参数传递为raw 使用这个的 JSON 对象:

{
    "school": {
        "name": "The Prince School",
        "alias": "The Prince"
    }
}

而且效果很好。

解决方案 2

我通过点击 Postman 的 Body 部分并选择 form-data 使用 form-data 提交了请求。所以请求看起来是这样的:

school[name]:The Prince School
school[alias]:The Prince

资源Testing Rails 5 API with Postman

就是这样。

我希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多