рельсы вложенные атрибуты уничтожить не работает на патч - PullRequest
0 голосов
/ 16 апреля 2019

При обновлении модели соглашения мне может понадобиться обновить 1 для многих вложений, это может включать удаление вложения.Я настроил вложенные атрибуты рельсов в модели, и, кажется, все работает для этого, например, добавление и обновление.но я не могу удалить работу.

Я прочитал документы и добавил все необходимые биты кода, чтобы включить эту функцию.но ничто, кажется, не торчит.

Использование Rails 5.0.7.1 и ruby ​​2.4.2

here is my agreement model 

  has_many :attachments,
           :class_name => 'Attachment',
           :foreign_key => 'attachable_id'

  accepts_nested_attributes_for :services
  accepts_nested_attributes_for :attachments, allow_destroy: true
here is the relevant controller code

  def update
    agreement = Contract::Agreement.find(params[:id])

    if agreement.update_attributes(agreement_params)
      render json: agreement, serializer: Contract::Agreement::Agreement
    else
      render json: {}, status: :bad_request
    end
  end

def agreement_params
    byebug
    unless params[:agreement][:attachments].blank?

      params[:agreement][:attachments_attributes] = params[:agreement][:attachments].map { |attachment|

        new_attachment = {}

        attachment.each do |key, value|
          new_attachment[:key] = value
        end
      }
      params[:agreement].delete :attachments
    end

    # byebug

    unless params[:agreement][:services].blank?
      params[:agreement][:services_attributes] = params[:agreement][:services]
      params[:agreement].delete :services
    end

    params.require(:agreement).permit(
      :status,
      :start_date,
      :end_date,
      :description,
      :parent,
      :level_id,
      :term_id,
      :service_provider_id,
      attachments_attributes: [
        :id,
        :file,
        :file_name,
        :file_size,
        :file_type,
        :attachable_type,
        :attachable_id,
        :_destroy
      ],
      services_attributes: [
        :id,
        :currency,
        :price,
        :facguid,
        :service_type_id,
        :agreement_id
      ]
    )
  end
and here is the test

it 'successfully deletes attachments', :attachments_testes => true do
        agreement = FactoryBot.create(:contract_agreement)

        attachment = FactoryBot.create(:agreement_attachment)
        attachment.attachable_id = agreement.id
        attachment.save

        expect(Attachment.count).to eq(1)

        agreement_attachments = [{id: attachment.id, _destroy: '1'}]
        patch :update, params: {id: agreement.id, agreement: {
            status: 'X',
            attachments: agreement_attachments
        }
        }
        agreement_response = JSON.parse(response.body)

        expect(response).to be_success
        expect(agreement_response['status']).to eq('X')
        byebug
        expect(Attachment.count).to eq(0)
      end

очевидно, что вложение должно быть удалено из моей базы данных.Когда я делаю начальную проверку вложений в середине теста, у меня есть 1 вложение в БД, и это связано с соглашением.Но в последнем ожидании после того, как ответ успешно возвращается, все обновляется, но вложение все еще там, как если бы оно проигнорировало _destroy.

1 Ответ

0 голосов
/ 17 апреля 2019

В вашем тесте у вас есть:

params: { id: agreement.id, 
         agreement: { status: 'X', 
                      attachments: agreement_attachments } 
        }

Не должно ли быть:

params: { id: agreement.id, 
          agreement: { status: 'X',
                       attachments_attributes: agreement_attachments }
        }
...