'ActionController::ParameterMissing' 与 User.rb 和 Rails 中的控制器相关

'ActionController::ParameterMissing' related to User.rb and controllers in Rails

我是 Rails 的新手,我被卡住了。我很沮丧,不喜欢得不到东西。

我在 postman 中的请求是:

localhost:3000/users?name='noah'&email='noah@gmail.com'

我的路由器是:

Rails.application.routes.draw do
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
  resources :users
  # Defines the root path route ("/")
  get 'users', to: 'users#index'#, as: 'users'
  post 'users', to: 'users#create'#, as: 'post_user'
  get 'users/new', to: 'users#new'#, as: 'new_user'
  get 'users/:id/edit', to: 'users#edit'#, as: 'edit_user'
  get 'users/:id', to: 'users#show'#, as: 'user'
  patch 'users/:id', to: 'users#update'#, as: 'patch_user'
  put 'users/:id',  to: 'users#update'#, as: 'update_user'
  delete 'users/:id', to: 'users#destroy'#, as: 'delete_user'
  # root "articles#index"
end

User.rb 型号:

class UsersController < ApplicationController
    def index
        render json: params
    end

    def new 
        render plain: 'This is new.'
    end

    def create
        user = User.new(params.require(:user).permit(:name, :email))

        # replace the `user_attributes_here` with the actual attribute keys
        user.save!
        render json: user
    end

    def show 
        #render :file => "/home/postgres/Documents/61729-0.pdf"
        render json: params
    end

    def update 
        render json: 'This is update in json!'
    end

    def destroy 
        render :file => "/home/postgres/Documents/61729-0.pdf"
    end
end

而 schema/db 是:

ActiveRecord::Schema[7.0].define(version: 2022_04_09_180203) do
  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

每当我尝试通过 postman 调用 post 命令创建用户对象时,我都会收到此错误:

localhost:3000/users?name='noah'&email='noah@gmail.com'

错误是:

ActionController::ParameterMissing at /users
============================================

param is missing or the value is empty: user

> To access an interactive console with this error, point your browser to: /__better_errors


app/controllers/users_controller.rb, line 11
--------------------------------------------

``` ruby
    6       def new 
    7           render plain: 'This is new.'
    8       end
    9   
   10       def create
>  11           user = User.new(params.require(:user).permit(:name, :email))
   12   
   13           # replace the `user_attributes_here` with the actual attribute keys
   14           user.save!
   15           render json: user
   16       end

应用回溯


Why is this happening?

#create 中的此代码:

user = User.new(params.require(:user).permit(:name, :email))

它假定参数以带有 user 键的散列形式出现,如下所示:

{ user: { name: "Bob", email: "bob@example.com" } }

这通常是我们在 Rails 中执行 create 操作时所期望的。

您的 POST 请求未发送包装在 user 对象中的参数。正在发送:

{ name: "Bob", email: "bob@example.com" }

require(:user) 立即抛出错误,因为 user 键不在参数中。

要解决此问题,您可以像这样格式化 URL,或将数据作为 JSON 有效负载发送:

localhost:3000/users?user[name]='noah'&user[email]='noah@example.com'