Search code examples
ruby-on-railsactiveadminhas-manyformtasticmultiple-select

Ruby on Rails and ActiveAdmin: add all object all at once instead add one by one


I'm using Ruby on Rails 5 API app with Active Admin. I have a model called Subscription with has_many courses (Course is also a model).

When I add courses to a subscription, I need to do it one by one, like in this picture: enter image description here

What I want is to have an option to add all the courses to a subscription all at once, instead of one by one. I tried using checkbox for multiple selection but it didn't worked. This is the code:

ActiveAdmin.register Subscription do
  # require 'lib/app_languages.rb'
  permit_params :name, :seat_limit, :domain, :language, :organization, course_ids: [], user_ids: [], subscription_courses_attributes: [:id, :course_id, :_destroy, :_create, :_update]

  config.sort_order = 'id_asc'

  # Index
  index do
    id_column
    column :name
    column :seat_limit
    column :domain
    column :organization
    column :language do |subscription|
       AppLanguages.languages[subscription.language]
    end
    column "Unlocked courses", :courses
    column :created_at
    actions
  end

  # Show
  show do
    attributes_table do
     row  :name
     row  :language do |subscription|
        AppLanguages.languages[subscription.language]
     end
     row  :seat_limit
     row  :domain
     row  :organization
     row  :created_at
    end

    panel 'Unlocked Courses' do
      table_for subscription.courses do
        column :id
        column "Title" do |course|
          link_to course.title, admin_course_path(course)
        end
        column "language" do |course|
          AppLanguages.languages[course.language]
        end
        column :author
      end
    end

    panel 'Subscribed users' do
      table_for subscription.users do
        column :id
        column "name" do |user|
          link_to user.name, admin_user_path(user)
        end
        column :email
        column "language preference" do |user|
          AppLanguages.languages[user.language]
        end
      end
    end
  end

  # Edit
  form do |f|
    f.semantic_errors *f.object.errors.keys

    f.inputs 'Details' do
     f.input :name
     f.input :language, :as => :select, :collection => AppLanguages.languages_array
     f.input :seat_limit
     f.input :domain
     f.input :organization
    end


    f.has_many :subscription_courses do |sub_c|
      sub_c.inputs "Unlocked Courses" do
        if !sub_c.object.nil?
          sub_c.input :_destroy, as: :boolean, label: "Destroy?"
        end
        sub_c.input :course ### should add here option for add all
      end
    end

    f.inputs 'Subscribed users:' do
      f.input :users
    end

    f.actions
  end
end


Solution

  • Using for the array the as: :select form input with multi-select should help. Something like this:

    sub_c.input :items, as: :select, 
                        collection: courses_collection, 
                        multiple: true