ActiveRecord :: AssociationTypeMismatch в отношениях один к одному - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь использовать почтальон для отправки формы в рельсах.У меня есть эти параметры

{
    "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 голосов
/ 10 мая 2019

Как вы пытаетесь создать книгу со СМИ.поэтому, пожалуйста, попробуйте это:

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: ''
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...