Вложенная форма в active_admin с опцией select или create - PullRequest
19 голосов
/ 26 августа 2011

Мы используем active_admin для нашего административного бэкэнда.

У нас есть модель "Приложение", которая: принадлежит модели "Издатель":

class App < ActiveRecord::Base
  belongs_to :publisher
end

class Publisher < ActiveRecord::Base
  has_many :apps
end

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

Есть ли способ сделать это в active_admin?

Вот что у нас есть (в admin / app.rb):

form :html => { :enctype => "multipart/form-data" } do |f|
  f.inputs do
    f.input :title
    ...
  end

  f.inputs do
    f.semantic_fields_for :publisher do |p| # this is for has_many assocs, right?
      p.input :name
    end
  end

  f.buttons
end

После нескольких часов поиска я буду признателен за любую подсказку ... Спасибо!

Ответы [ 4 ]

9 голосов
/ 02 ноября 2012

Сначала убедитесь, что в вашей модели Publisher у вас есть необходимые разрешения для связанного объекта:

class App < ActiveRecord::Base
  attr_accessible :publisher_attributes

  belongs_to :publisher
  accepts_nested_attributes_for :publisher, reject_if: :all_blank
end

Затем в файле ActiveAdmin:

form do |f|
  f.inputs do
    f.input :title
    # ...
  end

  f.inputs do
    # Output the collection to select from the existing publishers
    f.input :publisher # It's that simple :)

    # Then the form to create a new one
    f.object.publisher.build # Needed to create the new instance
    f.semantic_fields_for :publisher do |p|
      p.input :name
    end
  end

  f.buttons
end

Я используюнемного отличающаяся настройка в моем приложении (вместо этого отношения has_and_belongs_to_many), но мне удалось заставить его работать на меня.Дайте мне знать, если этот код выводит какие-либо ошибки.

7 голосов
/ 06 сентября 2011

Класс form_builder поддерживает метод с именем has_many.

f.inputs do
  f.has_many :publisher do |p|
    p.input :name
  end
end

Это должно сделать работу.

Обновление: я перечитал ваш вопрос, и это позволяет только добавить нового издателя, хотя я не уверен, как выбрать или создать.

5 голосов
/ 16 августа 2012

По данным ActiveAdmin: http://activeadmin.info/docs/5-forms.html

Вам просто нужно сделать, как показано ниже:

f.input :publisher
0 голосов
/ 06 января 2017

Я обнаружил, что вам нужно сделать 3 вещи.

Добавить семантические поля для формы

f.semantic_fields_for :publisher do |j|
  j.input :name
end

Добавить оператор nested_belongs_to в контроллер

controller do
    nested_belongs_to :publisher, optional: true
end

Обновите разрешенные параметры на контроллере, чтобы принимать параметры, используя атрибуты ключевого слова

permit_params publisher_attributes:[:id, :name]
...