Я новичок в Rails, и я застрял. Я расстроен и не люблю ничего не получать.
Мой запрос в почтальоне:
localhost:3000/users?name='noah'&email='[email protected]'
Мои роутеры:
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
И схема/БД:
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
Я получаю эту ошибку, когда когда-либо пытаюсь создать объект пользователя через почтальона, вызвав команду post:
localhost:3000/users?name='noah'&email='[email protected]'
Ошибка:
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: "[email protected]" } }
Обычно это то, что мы ожидаем, когда делаем действие create
в Rails.
Ваш запрос POST не отправляет параметры, завернутые в объект user
. Он просто отправляет:
{ name: "Bob", email: "[email protected]" }
require(:user)
сразу выдает ошибку, потому что ключа user
нет в параметрах.
Чтобы исправить это, вы можете отформатировать URL-адрес таким образом или отправить данные в виде полезной нагрузки JSON:
localhost:3000/users?user[name]='noah'&user[email]='[email protected]'
Как отправить его в виде полезной нагрузки JSON в почтальоне?
@naarter Learning.postman.com/docs/sending-requests/requests/#raw-datа
@naarter для другой ошибки о «application_records», я не уверен, почему вы это получите. Единственная причина, о которой я могу думать, это то, что вам не хватает этой строки в вашем ApplicationRecord
классе: self.abstract_class = true
Это то, о чем я думал, тбх. Однако я получил эту ошибку: ActiveRecord::StatementInvalid at /users ==================================== === PG::UndefinedTable: ОШИБКА: отношение "application_records" не существует СТРОКА 9: ГДЕ a.attrelid = '"application_records"'::regclass ^ > Чтобы получить доступ к интерактивной консоли с этой ошибкой, укажите в браузере: / __better_errors