Rails 5 API上的Curl请求导致ActionController :: ParameterMissing

时间:2017-10-13 16:46:38

标签: ruby-on-rails json api curl ruby-on-rails-5

我在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标志

Rails / API设置

配置/ 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

0 个答案:

没有答案