Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: TypeError (MAYBE-MARKETING-30) #242

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

revise-dev[bot]
Copy link
Contributor

@revise-dev revise-dev bot commented Feb 5, 2025

The error TypeError: nil can't be coerced into Float occurring on line 52 of the early mortgage payoff calculator indicates that we're attempting to perform floating-point arithmetic with a nil value. This is happening in the calculation of the remaining balance after making extra payments.

The root cause appears to be that the interest_rate attribute can become nil in certain scenarios, particularly when the mortgage rate cache doesn't return a value and the default of 0.0 isn't properly handling the calculation chain. A 0.0 interest rate also doesn't make practical sense for mortgage calculations.

Changes made to fix this:

  1. Changed the default interest_rate from 0.0 to 5.0 to provide a reasonable starting point that reflects typical mortgage rates. This prevents unwanted nil or zero scenarios that could break calculations.

  2. Added a min: 0.0 constraint to the interest_rate attribute to prevent negative interest rates which would cause unrealistic calculations.

  3. Modified the mortgage_rate_30 method to return a default value of 5.0 if the cache returns nil, ensuring we always have a workable interest rate.

  4. Updated the blank? method to check for nil values in addition to zero values, providing better validation.

These changes maintain the original intent of the calculator while making it more robust against nil values and unrealistic interest rate scenarios. The default 5.0% interest rate is a reasonable starting point that allows the calculator to function even when external rate data is unavailable.

Error Details

Summary:

TypeError: nil can't be coerced into Float

Stacktrace:

app/presenters/tool/presenter/early_mortgage_payoff_calculator.rb:52
app/presenters/tool/presenter/early_mortgage_payoff_calculator.rb:52
app/presenters/tool/presenter/early_mortgage_payoff_calculator.rb:20
action_view/base.rb:281
action_view/base.rb:281
action_view/template.rb:274
active_support/notifications.rb:210
active_support/notifications/instrumenter.rb:58
sentry/rails/tracing.rb:56
active_support/notifications.rb:210
action_view/template.rb:573
action_view/template.rb:262
action_view/renderer/partial_renderer.rb:252
active_support/notifications.rb:210
active_support/notifications/instrumenter.rb:58
sentry/rails/tracing.rb:56
active_support/notifications.rb:210
action_view/renderer/partial_renderer.rb:246
action_view/renderer/partial_renderer.rb:237
action_view/renderer/renderer.rb:78
action_view/renderer/renderer.rb:49
action_view/helpers/rendering_helper.rb:152
action_view/helpers/capture_helper.rb:50
action_view/buffers.rb:75
action_view/helpers/capture_helper.rb:50
action_view/helpers/tag_helper.rb:246
action_view/helpers/tag_helper.rb:345
/home/deploy/maybe-marketing-prod/shared/bundle/ruby/3.1.0/gems/turbo-rails-2.0.11/app/helpers/turbo/frames_helper.rb:42
action_view/base.rb:281
action_view/base.rb:281
action_view/template.rb:274
active_support/notifications.rb:210
active_support/notifications/instrumenter.rb:58
sentry/rails/tracing.rb:56
active_support/notifications.rb:210
action_view/template.rb:573
action_view/template.rb:262
action_view/renderer/partial_renderer.rb:252
active_support/notifications.rb:210
active_support/notifications/instrumenter.rb:58
sentry/rails/tracing.rb:56
active_support/notifications.rb:210
action_view/renderer/partial_renderer.rb:246
action_view/renderer/partial_renderer.rb:237
action_view/renderer/renderer.rb:78
action_view/renderer/renderer.rb:49
action_view/helpers/rendering_helper.rb:152
action_view/helpers/capture_helper.rb:50
action_view/buffers.rb:75
action_view/helpers/capture_helper.rb:50
action_view/helpers/capture_helper.rb:176
action_view/base.rb:281
action_view/base.rb:281
action_view/template.rb:274
active_support/notifications.rb:210
active_support/notifications/instrumenter.rb:58
sentry/rails/tracing.rb:56
active_support/notifications.rb:210
action_view/template.rb:573
action_view/template.rb:262
action_view/renderer/template_renderer.rb:66
active_support/notifications.rb:210
active_support/notifications/instrumenter.rb:58
sentry/rails/tracing.rb:56
active_support/notifications.rb:210
action_view/renderer/template_renderer.rb:60
action_view/renderer/template_renderer.rb:76
active_support/notifications.rb:210
active_support/notifications/instrumenter.rb:58
sentry/rails/tracing.rb:56
active_support/notifications.rb:210
action_view/renderer/template_renderer.rb:75
action_view/renderer/template_renderer.rb:59
action_view/renderer/template_renderer.rb:11
action_view/renderer/renderer.rb:58
action_view/renderer/renderer.rb:31
action_view/rendering.rb:135
action_view/base.rb:308
action_view/rendering.rb:134
action_controller/metal/streaming.rb:179
action_view/rendering.rb:121
action_controller/metal/rendering.rb:186
action_controller/metal/renderers.rb:142
abstract_controller/rendering.rb:29
action_controller/metal/rendering.rb:167
action_controller/metal/instrumentation.rb:31
active_support/benchmark.rb:17
action_controller/metal/instrumentation.rb:31
action_controller/metal/instrumentation.rb:100
active_record/railties/controller_runtime.rb:46
action_controller/metal/instrumentation.rb:30
meta_tags/controller_helper.rb:22
action_controller/metal/implicit_render.rb:39
action_controller/metal/basic_implicit_render.rb:9
abstract_controller/base.rb:226
action_controller/metal/rendering.rb:193
abstract_controller/callbacks.rb:261
active_support/callbacks.rb:120
turbo-rails.rb:24
/home/deploy/maybe-marketing-prod/shared/bundle/ruby/3.1.0/gems/turbo-rails-2.0.11/app/controllers/concerns/turbo/request_id_tracking.rb:10
active_support/callbacks.rb:129
action_text/rendering.rb:25
action_text/engine.rb:71
active_support/callbacks.rb:129
active_support/callbacks.rb:129
sentry/rails/controller_transaction.rb:21
sentry/hub.rb:115
sentry/span.rb:237
sentry/hub.rb:113
sentry-ruby.rb:503
sentry/rails/controller_transaction.rb:18
active_support/callbacks.rb:129
active_support/callbacks.rb:140
abstract_controller/callbacks.rb:260
action_controller/metal/rescue.rb:27
action_controller/metal/instrumentation.rb:76
active_support/notifications.rb:210
active_support/notifications/instrumenter.rb:58
sentry/rails/tracing.rb:56
active_support/notifications.rb:210
action_controller/metal/instrumentation.rb:75
action_controller/metal/params_wrapper.rb:259
active_record/railties/controller_runtime.rb:39
abstract_controller/base.rb:163
action_view/rendering.rb:40
action_controller/metal.rb:252
action_controller/metal.rb:335
action_dispatch/routing/route_set.rb:67
action_dispatch/routing/route_set.rb:50
action_dispatch/journey/router.rb:53
action_dispatch/journey/router.rb:133
action_dispatch/journey/router.rb:126
action_dispatch/journey/router.rb:126
action_dispatch/journey/router.rb:34
action_dispatch/routing/route_set.rb:908
logtail-rails/error_event.rb:24
logtail-rack/http_events.rb:213
logtail-rack/user_context.rb:74
logtail-rails/session_context.rb:16
logtail-rack/http_context.rb:23
logtail/current_context.rb:120
logtail/current_context.rb:44
logtail-rack/http_context.rb:22
rack/static.rb:161
rack/tempfile_reaper.rb:20
rack/etag.rb:29
rack/conditional_get.rb:31
rack/head.rb:15
action_dispatch/http/permissions_policy.rb:38
action_dispatch/http/content_security_policy.rb:36
rack/session/abstract/id.rb:274
rack/session/abstract/id.rb:268
action_dispatch/middleware/cookies.rb:706
action_dispatch/middleware/callbacks.rb:31
active_support/callbacks.rb:100
action_dispatch/middleware/callbacks.rb:30
sentry/rails/rescued_exception_interceptor.rb:14
action_dispatch/middleware/debug_exceptions.rb:31
sentry/rack/capture_exceptions.rb:30
sentry/hub.rb:269
sentry-ruby.rb:416
sentry/rack/capture_exceptions.rb:21
sentry/hub.rb:59
sentry-ruby.rb:396
sentry/rack/capture_exceptions.rb:20
action_dispatch/middleware/show_exceptions.rb:32
rails/rack/logger.rb:41
rails/rack/logger.rb:29
action_dispatch/middleware/remote_ip.rb:96
action_dispatch/middleware/request_id.rb:34
rack/method_override.rb:28
rack/runtime.rb:24
active_support/cache/strategy/local_cache_middleware.rb:29
action_dispatch/middleware/executor.rb:16
action_dispatch/middleware/static.rb:27
rack/sendfile.rb:114
action_dispatch/middleware/ssl.rb:92
rails/engine.rb:536
puma/configuration.rb:279
puma/request.rb:99
puma/thread_pool.rb:389
puma/request.rb:98
puma/server.rb:468
puma/server.rb:249
puma/thread_pool.rb:166

Tip

You can make revisions or ask questions of Revise.dev by using /revise in any comment or review!

  • /revise Add a comment above the method to explain why we're making this change.
  • /revise Why did you choose to make this change specifically?

Important

If something doesn’t look right, click to retry this interaction.

Quick links: View in SentryView in Revise

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

0 participants