From 793b4e899d30c8a8be25f9a2d39da6e36aac3040 Mon Sep 17 00:00:00 2001 From: travis Date: Fri, 28 Jun 2019 16:37:23 -0700 Subject: [PATCH] work around lack of Rack::MethodOverride in Rails api by artifically accepting _method: delete --- config/routes.rb | 8 ++++++-- .../letter_opener_web/letters_controller_spec.rb | 12 +++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 8b31ecd..e93d49c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,8 +1,12 @@ # frozen_string_literal: true LetterOpenerWeb::Engine.routes.draw do - delete 'clear' => 'letters#clear', as: :clear_letters - delete ':id' => 'letters#destroy', as: :delete_letter + delete_pseudo_method_constraint = ->(req) { req.params['_method'] == 'delete' } + + delete 'clear' => 'letters#clear', as: :clear_letters + post 'clear' => 'letters#clear', constraints: delete_pseudo_method_constraint + delete ':id' => 'letters#destroy', as: :delete_letter + post ':id' => 'letters#destroy', constraints: delete_pseudo_method_constraint get '/' => 'letters#index', as: :letters get ':id(/:style)' => 'letters#show', as: :letter get ':id/attachments/:file' => 'letters#attachment' diff --git a/spec/controllers/letter_opener_web/letters_controller_spec.rb b/spec/controllers/letter_opener_web/letters_controller_spec.rb index 01ec7a8..3463695 100644 --- a/spec/controllers/letter_opener_web/letters_controller_spec.rb +++ b/spec/controllers/letter_opener_web/letters_controller_spec.rb @@ -112,15 +112,25 @@ delete :clear expect(response).to redirect_to(letters_path) end + + it 'works with a post and _method: delete pseudo delete method' do + post :clear, params: { _method: 'delete' } + expect(response).to redirect_to(letters_path) + end end describe 'DELETE destroy' do let(:id) { 'an-id' } + before { allow_any_instance_of(LetterOpenerWeb::Letter).to receive(:exists?).and_return(true) } it 'removes the selected letter' do - allow_any_instance_of(LetterOpenerWeb::Letter).to receive(:exists?).and_return(true) expect_any_instance_of(LetterOpenerWeb::Letter).to receive(:delete) delete :destroy, params: { id: id } end + + it 'works with a post and _method: delete pseudo delete method' do + expect_any_instance_of(LetterOpenerWeb::Letter).to receive(:delete) + post :destroy, params: { _method: 'delete', id: id } + end end end