Active Admin has_many with a set number of nested relationships

I use Active Admin, and I have a one-to-many relationship between the two models:

class WeeklyMenu < ActiveRecord::Base has_many :menu_items attr_accessible :menu_items accepts_nested_attributes_for :menu_items end 

On the admin page for WeeklyMenu, I want to display five menu_items. This is what my admin page looks like:

 ActiveAdmin.register WeeklyMenu do form do |f| f.inputs "Details" do f.input :title f.input :week end f.has_many :menu_items do |menu_item| menu_item.input :title end f.buttons end end 

This gives me a very nice interface for adding additional menu_items, but I want the user to have five of them - no more and no less. How can I do it?

+4
source share
4 answers

Replace

 f.has_many :menu_items do |menu_item| menu_item.input :title end 

with

 f.inputs "Menu items" do 5.times do f.object.menu_items.build end f.fields_for :menu_items do |m| m.inputs do m.input :title end end end 

It may not be the best solution, but it should work ...

+4
source

The fields_for answer that @ user946611 suggested did not work for me, but the following code did:

 f.inputs 'Menu Items' do (5 - f.object.menu_items.count).times do f.object.menu_items.build end f.has_many :menu_items, new_record: false do |m| m.input :title m.input(:_destroy, as: :boolean, required: false, label: 'Remove') if m.object.persisted? end end 

It will always display 5 forms for elements, regardless of whether they had so many created or not. new_record: false disables the "Add a new menu item" button.

+3
source

If you want to change the form again, there is no condition in @ user946611's answer to determine if the menu_item file exists, because five more menu_items will be created when you submit and edit the form.

so this should be:

 f.inputs 'Menu Items' do if !f.object.menu_items.present? 5.times do f.object.menu_items.build end end f.fields_for :menu_items do |m| m.inputs do m.input :title end end end 
+2
source

Activeadmin defines callbacks that can be used for this kind of thing: https://github.com/activeadmin/activeadmin/blob/master/lib/active_admin/resource_dsl.rb#L157-L161

The after_build hook seems like a good place to initialize the has_many relationship

 ActiveAdmin.register WeeklyMenu do after_build do |weekly_menu| (5 - weekly_menu.menu_items.size).times do weekly_menu.menu_items.build end end form do |f| f.inputs "Details" do f.input :title f.input :week end f.has_many :menu_items do |menu_item| menu_item.input :title end f.buttons end end 
0
source

Source: https://habr.com/ru/post/1479254/


All Articles