activeadmin: adding delete for a nested resource

前端 未结 6 1897
我在风中等你
我在风中等你 2021-02-12 10:42

I have a infrastructure object composed for many datacenters. In the apps/admin/infrastructures.rb I have the following code:

form do |f|
  f.inputs \"Infrastruc         


        
相关标签:
6条回答
  • 2021-02-12 11:00

    I hope this will be helpful (I've changed my code to suit your example, so I hope there are no typos here):

      form do |f|
        f.inputs "Infrastructure details" do
          f.input :name
    
          f.has_many :datacenters do |datacenter_form|
            datacenter_form.inputs :datacenters do
              datacenter_form.input :name
            end
            datacenter_form.buttons do
              link_to "Delete", admin_datacenter_path(datacenter_form.object), method: "delete", class: "button" unless datacenter_form.object.new_record?
            end
          end
        end
        f.buttons
      end
    

    and the controller method should be defined in datacenters.rb

    controller do
        def destroy
          @datacenter = Datacenter.find(params[:id])
          @datacenter.destroy
          redirect_to edit_admin_retailer_path(@datacenter.infrastructure)
        end
      end
    
    0 讨论(0)
  • 2021-02-12 11:01

    This should work:

    datacenter_form.label :_delete
    datacenter_form.check_box :_delete
    

    This adds a checkbox for each nested object which will delete the object if checked.

    0 讨论(0)
  • 2021-02-12 11:02

    If you cant destroy the object nested. You need to put :_destroy in your app/admin/object.rb permit_params

    permit_params :id,:name, :cod, :_destroy
    
    0 讨论(0)
  • 2021-02-12 11:05

    Don't forget to add the following to your parent model

    has_many :child_name, :dependent => :destroy
    
    0 讨论(0)
  • 2021-02-12 11:10

    Solved adding the following line:

    datacenter_form.input :_destroy, :as => :boolean, :required => false, :label => 'Remove'
    

    The code looks like:

    form do |f|
      f.inputs "Infrastructure details" do
        f.input :name
    
        f.has_many :datacenters do |datacenter_form|
          datacenter_form.input :name
          datacenter_form.input :_destroy, :as => :boolean, :required => false, :label => 'Remove'
        end
      end
      f.buttons
    end
    
    0 讨论(0)
  • 2021-02-12 11:14

    Sep 2017 Update:

    Rails 5.1.4, ActiveAdmin 1.0.0

    Append :id and _destroy in permit_params along with other attributes from the model e.g. :name in your case. Then provide the :allow_destroy option in f.has_many too. Other requirements remain the same; like adding allow_destroy: true in accepts_nested_attributes_for.

    Final look:

    ActiveAdmin.register Infrastructure do
      permit_params :name, datacenters_attributes: [:id, :_destroy, :name]
    
      form do |f|
        f.inputs "Infrastructure details" do
          f.input :name
    
          f.has_many :datacenters, heading: false,
                                   allow_destroy: true,
                                   new_record: false do |datacenter_form|
            datacenter_form.input :name        
          end
        end
        f.buttons
      end
    end
    

    ActiveAdmin Reference


    This worked for me:

         i.input :_destroy, as: :boolean
    

    and in the Model remember to add :allow_destroy :

         accepts_nested_attributes_for :images, allow_destroy: true
    
    0 讨论(0)
提交回复
热议问题