Как создать форму для новых ресурсов, к которым присоединились отношения has_many в Active Admin - PullRequest
0 голосов
/ 11 марта 2020

У меня есть простая ситуация в моей базе данных. Author has_many Books.

С Active Admin я хочу дать пользователям возможность добавлять новых авторов с их новыми книгами.

То, что у меня сейчас есть, выглядит так:

ActiveAdmin.register Author do
  menu false

  actions :new, :create

  permit_params :books

  form do |f|
    f.has_many :books, new_record: true do |book|
      books.inputs 'book' do
        book.input :title
      end
    end
  end
end

однако, когда я go к действию new, я получаю ошибку

undefined method new_record? for nil:NilClass 

указывает на

f.has_many :books, new_record: true do |book| 

Нужно ли переопределять new и инициализировать новые объекты? Что если я хочу добавить несколько книг динамически? Есть ли решение по умолчанию для такого сценария?

Ответы [ 3 ]

0 голосов
/ 12 марта 2020

Да. Если вы хотите, чтобы в вашей форме отображались входные данные для пустой книги, при этом пользователю не нужно нажимать «Добавить книгу» (поведение по умолчанию), а затем предварительно заполнить книгу новой:

controller do
  def new
    build_resource
    resource.books << Book.new
    new!
  end

Я не уверен, что Вы подразумеваете под «несколько книг динамически», но по умолчанию JavaScript и кнопка «Добавить» должны обрабатывать это.

Как уже отмечалось, вам нужно accepts_nested_attributes_for :books в модели и расширение вашего allow_params .

0 голосов
/ 12 марта 2020

Сначала вы должны указать модели Author, что она принимает атрибуты Books. Вы должны сделать это в model/author.rb. Добавьте строку -

 accepts_nested_attributes_for :books, :allow_destroy => true

Затем вы можете разрешить параметры в модели активного администратора правильно принимать атрибуты книг.

books_attributes: [:title]

Затем вы можете добавить форму, как показано ниже, где activeadmin будет динамически обрабатывать создание нового объекта или его удаление.

f.has_many :book do |b|
  b.inputs 'Books' do
    b.input :title
  end
end
0 голосов
/ 12 марта 2020

Первое, что я могу догадаться, исходя из того, что вы сказали, это то, что вам нужно вводить как пользовательские параметры, так и книги. База данных должна вставлять пользователя INTO так же, как и книги INSERT INTO. Поскольку Rails является отличной средой и говорит: «Соглашение о конфигурации», единственный способ, которым мы могли бы дать вам утвердительный ответ, - проверить ваш репозиторий.

Однако «new_record?» Метод всегда работает, когда вы пытаетесь вставить в базу данных новые данные. Вы не видите его, потому что он ничего не показывает, пока вы не попытаетесь ВСТАВИТЬ новые данные без запуска другой миграции базы данных. В новейшей версии Rails миграция выполняется как rails db:migrate. Старые версии Rails используют rake db:migrate.

Как я уже сказал, проверка вашего репо - лучший способ дать вам соответствующий ответ. Приветствия

...