Формы ActiveAdmin с отношениями has_many - belongs_to?
У меня есть модели Home и Photo, которые имеют отношение has_many - belongs_to (полиморфные отношения, но я не думаю, что это имеет значение в этом случае). Теперь я настраиваю активный администратор, и я бы хотел, чтобы администраторы могли добавлять фотографии в дома из формы дома.
Фотографии управляются камнем CarrierWave, который я не знаю, будет ли проблема проще или сложнее.
Как включить поля формы для другой модели в форме Active Admin Home? Любой опыт делает что-то подобное?
class Home < ActiveRecord::Base
validates :name, :presence => true,
:length => { :maximum => 100 }
validates :description, :presence => true
has_many :photos, :as => :photographable
end
class Photo < ActiveRecord::Base
belongs_to :photographable, :polymorphic => true
mount_uploader :image, ImageUploader
end
Ответы
Ответ 1
Попробуйте что-нибудь подобное в app/admin/home.rb:
form do |f|
f.inputs "Details" do
f.name
end
f.has_many :photos do |photo|
photo.inputs "Photos" do
photo.input :field_name
#repeat as necessary for all fields
end
end
end
Удостоверьтесь, что это в вашей домашней модели:
accepts_nested_attributes_for :photos
Я изменил это из другого вопроса: Как использовать ActiveAdmin для моделей с использованием has_many через ассоциацию?
Ответ 2
Я думаю, вы ищете форму для вложенной модели. Взгляните на следующие railscasts.
http://railscasts.com/episodes/196-nested-model-form-part-1
http://railscasts.com/episodes/197-nested-model-form-part-2
Я не могу много рассказать об active_admin, но я думаю, что это не должно влиять на обработку вложенной модели.
Ответ 3
У меня есть модель has_one, например:
f.has_many :addresses do |a|
a.inputs "Address" do
a.input :street ... etc.
Хотя это верно отражает наши ассоциации для Address
(который является полиморфной моделью) с использованием f.has_one
не выполняется. Поэтому я перешел на has_many
и все хорошо. Кроме того, мы должны помешать нашим пользователям создавать несколько адресов для одного и того же объекта.
Ответ 4
Вы можете попробовать следующее:
form do |f|
f.semantic_errors # shows errors on :base
f.inputs # builds an input field for every attribute
f.inputs 'Photos' do
f.has_many :photos, new_record: false do |p|
p.input :field_name
# or maybe even
p.input :id, label: 'Photo Name', as: :select, collection: Photo.all
end
end
f.actions # adds the 'Submit' and 'Cancel' buttons
end
Кроме того, вы можете посмотреть https://github.com/activeadmin/activeadmin/blob/master/docs/5-forms.md (см. Вложенные ресурсы)