【问题标题】:AssociationTypeMisMatch: How can I create an object and associated (nested) objects with RESTful API (Rails) accepting JSON?AssociationTypeMisMatch:如何使用接受 JSON 的 RESTful API (Rails) 创建对象和关联(嵌套)对象?
【发布时间】:2019-05-15 01:24:53
【问题描述】:

我已经尝试了几个小时,但我似乎无法理解我做错了什么。出于演示目的,我简化了示例。

单独创建Car 对象是可行的,但将Wheel 对象附加到它会导致ActiveRecord::AssociationTypeMisMatch

鉴于汽车和车轮类

class Car < ApplicationRecord
  has_many :wheels

  validates :max_speed_in_kmh,
            :name, presence: true
end


class Wheel < ApplicationRecord
  has_one :car

  validates :thickness_in_cm,
            :place, presence: true
end

还有一个 CarsController

module Api
  module V1
    class CarsController < ApplicationController

      # POST /cars
      def create
        @car = Car.create!(car_params)
        json_response(@car, :ok)
      end

      private

      def car_params
        params.permit(
          :max_speed_in_kmh,
          :name,
          { wheels: [:place, :thickness_in_cm] }
        )
      end
    end
  end
end

echo '{"name":"Kid","max_speed_in_kmh":300,"wheels":[{"thickness_in_cm":70, "place":"front"},{"thickness_in_cm":75, "place":"rear"}]}' | http POST httpbin.org/post

... "json": { "max_speed_in_kmh": 300, "name": "Kid", "wheels": [ { "place": "front", "thickness_in_cm": 70 }, { "place": "rear", "thickness_in_cm": 75 } ] }, ...

JSON 格式正确。撇开轮子,Car 对象被创建并持久化。使用Wheel 对象,控制器返回

status 500 error Internal Server Error exception #<ActiveRecord::AssociationTypeMismatch: Wheel(#70285481379180) expected, got {"place"=>"front", "thickness_in_cm"=>75} which is an instance of ActiveSupport::HashWithIndifferentAccess(#70285479411000)>

【问题讨论】:

  • 控制器中的预算是什么?
  • 我在简化示例时忘记重命名它。固定的。我是说汽车。 @Rthi

标签: ruby-on-rails json api nested


【解决方案1】:

如果你想和轮子一起创建汽车,你需要使用accepts_nested_attributes_for

添加到汽车模型accepts_nested_attributes_for :wheels 并将强参数更改为

  def car_params
    params.permit(
      :max_speed_in_kmh,
      :name,
      { wheels_attributes: [:id, :place, :thickness_in_cm] }
    )
  end

【讨论】:

    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2019-02-16
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多