Вложенная форма в active_admin с опцией select или create
Мы используем active_admin для нашего администрирования.
У нас есть модель "App", которая: принадлежит модели "Publisher":
class App < ActiveRecord::Base
belongs_to :publisher
end
class Publisher < ActiveRecord::Base
has_many :apps
end
При создании новой записи для модели "App" я хочу иметь возможность либо выбрать существующий издатель, либо (если издатель еще не создан), чтобы создать нового издателя в той же (вложенной) форме (или по крайней мере, не выходя из страницы).
Есть ли способ сделать это в 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
После нескольких часов поиска я был бы признателен за любой намек... Спасибо!
Ответы
Ответ 1
Во-первых, убедитесь, что в вашей модели 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 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), но мне удалось заставить ее работать для меня. Дайте мне знать, выводит ли этот код какие-либо ошибки.
Ответ 2
Класс form_builder поддерживает метод has_many
.
f.inputs do
f.has_many :publisher do |p|
p.input :name
end
end
Это должно выполнить эту работу.
Обновление: я перечитываю ваш вопрос, и это позволяет добавлять нового издателя, я не уверен, как сделать выбор или создать хотя.
Ответ 3
Согласно ActiveAdmin: http://activeadmin.info/docs/5-forms.html
Вам просто нужно сделать следующее:
f.input :publisher
Ответ 4
Я нашел, что вам нужно сделать 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]
Надеюсь, это поможет.