Fix NoMethodError on nil entryable in account activity feed (#1316)

* Fix NoMethodError when entry has nil entryable

Guard against orphaned entries where the entryable record has been
deleted but the entry still exists, preventing a crash on the
account show page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add dependent: :destroy to Entryable has_one :entry

The polymorphic has_one :entry association lacked a dependent option,
meaning if a Transaction/Trade/Valuation was ever deleted directly
(bypassing the Entry), the Entry would be left orphaned with a nil
entryable — causing NoMethodError in the activity feed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add nil entryable guard to _split_group.html.erb

Same defensive check as _entry.html.erb for consistency.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Serge L
2026-03-29 11:30:12 -04:00
committed by GitHub
parent c14ba6d0c9
commit 861a2d2d91
3 changed files with 9 additions and 5 deletions

View File

@@ -10,7 +10,7 @@ module Entryable
included do
include Enrichable
has_one :entry, as: :entryable, touch: true
has_one :entry, as: :entryable, touch: true, dependent: :destroy
scope :with_entry, -> { joins(:entry) }

View File

@@ -1,4 +1,6 @@
<%# locals: (entry:, balance_trend: nil, view_ctx: "global") %>
<%= render partial: entry.entryable.to_partial_path,
locals: { entry: entry, balance_trend: balance_trend, view_ctx: view_ctx } %>
<% if entry.entryable.present? %>
<%= render partial: entry.entryable.to_partial_path,
locals: { entry: entry, balance_trend: balance_trend, view_ctx: view_ctx } %>
<% end %>

View File

@@ -2,7 +2,9 @@
<div class="split-group">
<%= render "transactions/split_parent_row", entry: split_group.parent %>
<% split_group.children.each do |child_entry| %>
<%= render partial: child_entry.entryable.to_partial_path,
locals: { entry: child_entry, in_split_group: true } %>
<% if child_entry.entryable.present? %>
<%= render partial: child_entry.entryable.to_partial_path,
locals: { entry: child_entry, in_split_group: true } %>
<% end %>
<% end %>
</div>