При обновлении модели соглашения мне может понадобиться обновить 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.