一对一关系中的ActiveRecord :: AssociationTypeMismatch

时间:2019-05-10 09:23:56

标签: ruby-on-rails

我正在尝试使用邮递员在rails中提交表单。我有这些参数

{
    "book": {
        "title": "rrewr",
        "media": {
            "name": "hello",
            "format": "jpg"
        }
    }
}

提交此参数时。我在控制器中有这些用于创建书籍的代码

class Admin::BookController < ApplicationController
  def create
    @book = Book.new(book_params)

    if(@book.save)
     # redirect_to @post
    end
  end

  private def book_params
    params.require(:book).permit(:title, :media => [:name, :format])
  end
end

我与书籍和媒体有一对一的关系。但是当我收到请求时。我得到这个错误 <ActiveRecord::AssociationTypeMismatch: Media(#70348614328640) expected, got {\"name\"=>\"hello\", \"format\"=>\"jpg\"} which is an instance of ActiveSupport::HashWithIndifferentAccess(#47385709875460)>

我已经在Rails文档中甚至在google中搜索了此内容,但找不到与我相同的问题。我有用于图书和媒体的这种模式

class Book < ApplicationRecord
   belongs_to :media
end

class Media < ApplicationRecord
    has_one :book
end

我有这些迁移。如果我做错了,请纠正我。我无法确定代码的哪一部分有误或缺少要添加的代码。

class CreateBooks < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.string :title
      t.references :media, index: true, foreign_key: true

      t.timestamps
    end
  end
end

class CreateMedia < ActiveRecord::Migration[5.2]
  def change
    create_table :media do |t|
      t.string :name
      t.string :format

      t.timestamps
    end
  end
end

1 个答案:

答案 0 :(得分:0)

在尝试用媒体创建书籍时。因此,请尝试以下操作:

class Admin::BookController < ApplicationController
  def create
    @media = Media.new(media_params)
    ActiveRecord::Base.transaction do
      @media.save!
      @media.create_book!(book_params)

      # redirect_to @post
    end
  end

  private
  def book_params
    params.require(:book).permit(:title)
  end
  def media_params
    params.require(:media).permit(:name, :format)
  end
end

对于邮递员,请尝试传递如下参数:

 media: {
    name: '',
    format: ''
  },
  book: {
    title: ''
  }
}