我在Rails 5中创建了一个待办事项列表API,但我遇到了一个我似乎无法解决的错误。基本上,我有用户,列表和项目。项目属于列表,列表属于用户。
在命令行中使用curl,我已经成功创建了一个用户。但是,当我尝试按照相同的步骤创建列表时,我从rails服务器看到此错误:
ActionController :: ParameterMissing(param丢失或值为空:list):
app / controllers / api / lists_controller.rb:15:在'list_params'中
app / controllers / api / lists_controller.rb:5:在'create'
在这里和其他地方研究了几个小时后,我的想法是:
1.对于列表和用户之间的belongs_to关系,我的curl请求格式不正确
2.对于列表和用户之间的belongs_to关系,我的强参数格式不正确
3.我正在学习Rails 4的课程,但由于我使用的是Rails 5,所以有些不同
由于我能够成功创建用户,因此我将包含用户代码以及列表代码。我一直在绞尽脑汁,太长时间了,所以我真心希望有人可以帮助我。
创建新用户:
curl -d "user[username]=thisisatest" -d "user[password]=thisisatest" http://localhost:3000/api/users/
这创建了一个用户ID为10的用户,我在列表示例中使用
创建新列表:
curl --digest -u thisisatest:thisisatest -d "list[title]=test list" -d "list[private]=true" http://localhost:3000/api/users/10/lists
我正在使用bcrypt,所以我的数据库使用了password_digest,这就是为什么我包含了--digest标志
配置/ routes.rb中
Rails.application.routes.draw do
root 'welcome#index'
namespace :api, defaults: { format: :json } do
resources :users do
resources :lists
end
resources :lists, only: [] do
resources :items, only: [:create]
end
resources :items, only: [:destroy]
end
end
分贝/ schema.rb
ActiveRecord::Schema.define(version: 20171005175122) do
create_table "items", force: :cascade do |t|
t.text "body"
t.integer "list_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["list_id"], name: "index_items_on_list_id"
end
create_table "lists", force: :cascade do |t|
t.string "title"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.boolean "private"
t.index ["user_id"], name: "index_lists_on_user_id"
end
create_table "users", force: :cascade do |t|
t.string "username"
t.string "password_digest"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
应用/ contollers / api_controller.rb
class ApiController < ApplicationController
skip_before_action :verify_authenticity_token
private
def authenticated?
authenticate_with_http_basic {|username, password| User.where( username: username, password: password).present? }
end
end
应用/控制器/ API / users_controller.rb
class Api::UsersController < ApiController
before_action :authenticated?
def index
users = User.all
render json: users, each_serializer: UserSerializer
end
def create
user = User.new(user_params)
if user.save
render json: user
else
render json: {errors: user.errors.full_messages }, status: :unprocessable_entity
end
end
private
def user_params
params.require(:user).permit(:username, :password)
end
end
应用/模型/ user.rb
class User < ApplicationRecord
has_many :lists, dependent: :destroy
validates :username,
presence: true,
length: { minimum: 1, maximum: 100 },
uniqueness: { case_sensitive: false }
validates :password,
presence: true,
length: { minimum: 6 }
has_secure_password
end
应用/串行化器/ user_serializer.rb
class UserSerializer < ActiveModel::Serializer
attributes :id, :created_at, :username
end
应用/控制器/ API / lists_controller.rb
class Api::ListsController < ApiController
before_action :authenticated?
def create
list = List.new(list_params)
if list.save
render json: list
else
render json: {errors: list.errors.full_messages }, status: :unprocessable_entity
end
end
private
def list_params
params.require(:list).permit(:title, :private)
end
end
应用/模型/ list.rb
class List < ApplicationRecord
belongs_to :user
has_many :items, dependent: :destroy
validates :title, length: { minimum: 1 }, presence: true
validates :user, presence: true
end
应用/串行化器/ list_serializer.rb
class ListSerializer < ActiveModel::Serializer
attributes :id, :title, :user_id, :private
end