Skip to content

Commit 8554f33

Browse files
committed
Refactor navigation item updates for Turbo and HTML
1 parent d285fda commit 8554f33

File tree

2 files changed

+80
-22
lines changed

2 files changed

+80
-22
lines changed

app/controllers/better_together/navigation_items_controller.rb

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,13 @@ def create
4444
end
4545
end
4646

47-
def update # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
47+
def update
4848
authorize @navigation_item
4949

50-
respond_to do |format|
51-
if @navigation_item.update(navigation_item_params)
52-
flash[:notice] = t('navigation_item.updated')
53-
format.html { redirect_to @navigation_area, notice: t('navigation_item.updated') }
54-
format.turbo_stream do
55-
redirect_to @navigation_area, only_path: true
56-
end
57-
else
58-
flash.now[:alert] = t('navigation_item.update_failed')
59-
format.html { render :edit, status: :unprocessable_entity }
60-
format.turbo_stream do
61-
render turbo_stream: [
62-
turbo_stream.update('form_errors', partial: 'layouts/better_together/errors',
63-
locals: { object: @navigation_item }),
64-
turbo_stream.update('navigation_item_form', partial: 'better_together/navigation_items/form',
65-
# rubocop:todo Layout/LineLength
66-
locals: { navigation_item: @navigation_item, navigation_area: @navigation_area })
67-
# rubocop:enable Layout/LineLength
68-
]
69-
end
70-
end
50+
if @navigation_item.update(navigation_item_params)
51+
handle_update_success
52+
else
53+
handle_update_failure
7154
end
7255
end
7356

@@ -80,6 +63,30 @@ def destroy
8063

8164
private
8265

66+
def handle_update_success
67+
flash[:notice] = t('navigation_item.updated')
68+
respond_to do |format|
69+
format.html { redirect_to @navigation_area, notice: flash[:notice] }
70+
format.turbo_stream { redirect_to @navigation_area, only_path: true }
71+
end
72+
end
73+
74+
def handle_update_failure
75+
flash.now[:alert] = t('navigation_item.update_failed')
76+
respond_to do |format|
77+
format.html { render :edit, status: :unprocessable_entity }
78+
format.turbo_stream do
79+
render turbo_stream: [
80+
turbo_stream.update('form_errors', partial: 'layouts/better_together/errors',
81+
locals: { object: @navigation_item }),
82+
turbo_stream.update('navigation_item_form', partial: 'better_together/navigation_items/form',
83+
locals: { navigation_item: @navigation_item,
84+
navigation_area: @navigation_area })
85+
]
86+
end
87+
end
88+
end
89+
8390
def available_parent_items
8491
BetterTogether::NavigationItem.where.not(id: @navigation_item.id).includes(
8592
:string_translations,
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe 'NavigationItems', type: :request do
6+
include BetterTogether::Engine.routes.url_helpers
7+
8+
let(:navigation_area) { create(:navigation_area) }
9+
let(:navigation_item) { create(:navigation_item, navigation_area: navigation_area, title: 'Old Title') }
10+
11+
before do
12+
allow_any_instance_of(BetterTogether::NavigationItemsController).to receive(:authorize)
13+
end
14+
15+
describe 'PATCH /navigation_areas/:navigation_area_id/navigation_items/:id' do
16+
context 'HTML format' do
17+
it 'redirects on success' do
18+
patch navigation_area_navigation_item_path(navigation_area, navigation_item, locale: I18n.default_locale),
19+
params: { navigation_item: { title: 'New Title' } }
20+
21+
expect(response).to redirect_to(navigation_area_path(navigation_area, locale: I18n.default_locale))
22+
expect(flash[:notice]).to be_present
23+
end
24+
25+
it 'renders edit on failure' do
26+
patch navigation_area_navigation_item_path(navigation_area, navigation_item, locale: I18n.default_locale),
27+
params: { navigation_item: { title: '' } }
28+
29+
expect(response).to have_http_status(:unprocessable_entity)
30+
expect(response.body).to include('navigation_item_form')
31+
end
32+
end
33+
34+
context 'Turbo Stream format' do
35+
it 'redirects on success' do
36+
patch navigation_area_navigation_item_path(navigation_area, navigation_item, locale: I18n.default_locale),
37+
params: { navigation_item: { title: 'New Title' } }, as: :turbo_stream
38+
39+
expect(response).to redirect_to(navigation_area_path(navigation_area, locale: I18n.default_locale))
40+
end
41+
42+
it 'renders turbo stream on failure' do
43+
patch navigation_area_navigation_item_path(navigation_area, navigation_item, locale: I18n.default_locale),
44+
params: { navigation_item: { title: '' } }, as: :turbo_stream
45+
46+
expect(response.media_type).to eq('text/vnd.turbo-stream.html')
47+
expect(response.body).to include('form_errors')
48+
end
49+
end
50+
end
51+
end

0 commit comments

Comments
 (0)