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

Incompatibility with strict loading #2563

Closed
HashNotAdam opened this issue Apr 3, 2024 · 1 comment
Closed

Incompatibility with strict loading #2563

HashNotAdam opened this issue Apr 3, 2024 · 1 comment
Labels
bug breakages in functionality that is implemented

Comments

@HashNotAdam
Copy link

HashNotAdam commented Apr 3, 2024

I have a brand new installation of administrate in an application using Active Record strict loading. At this point, I haven't modified the auto-generated dashboards and I can get the index and show pages of a model but, as soon as I try to edit it, I receive a strict loading violation.

I'm using:

  • rails 7.1.3.2
  • administrate 1.0.0.beta1

Error and backtrace:

ActionView::Template::Error (`Condition` is marked for strict_loading. The ConditionsObservationElement association named `:conditions_observation_elements` cannot be lazily loaded.):
    24: </div>
    25: <div class="field-unit__field">
    26:   <%= f.select(field.attribute_key, nil, {}, multiple: true) do %>
    27:     <%= options_for_select(field.associated_resource_options, field.selected_options) %>
    28:   <% end %>
    29: </div>

activerecord (7.1.3.2) lib/active_record/core.rb:230:in `strict_loading_violation!'
activerecord (7.1.3.2) lib/active_record/associations/association.rb:223:in `find_target'
activerecord (7.1.3.2) lib/active_record/associations/collection_association.rb:270:in `load_target'
activerecord (7.1.3.2) lib/active_record/associations/collection_proxy.rb:45:in `load_target'
activerecord (7.1.3.2) lib/active_record/associations/collection_proxy.rb:1012:in `records'
activerecord (7.1.3.2) lib/active_record/relation/delegation.rb:100:in `each'
administrate (1.0.0.beta1) lib/administrate/field/has_many.rb:48:in `map'
administrate (1.0.0.beta1) lib/administrate/field/has_many.rb:48:in `selected_options'
administrate (1.0.0.beta1) app/views/fields/has_many/_form.html.erb:27
actionview (7.1.3.2) lib/action_view/helpers/tags/select.rb:11:in `block in initialize'
actionview (7.1.3.2) lib/action_view/helpers/capture_helper.rb:50:in `block in capture'
actionview (7.1.3.2) lib/action_view/buffers.rb:75:in `capture'
actionview (7.1.3.2) lib/action_view/helpers/capture_helper.rb:50:in `capture'
actionview (7.1.3.2) lib/action_view/helpers/tags/select.rb:11:in `initialize'
actionview (7.1.3.2) lib/action_view/helpers/form_options_helper.rb:160:in `new'
actionview (7.1.3.2) lib/action_view/helpers/form_options_helper.rb:160:in `select'
actionview (7.1.3.2) lib/action_view/helpers/form_options_helper.rb:849:in `select'
administrate (1.0.0.beta1) app/views/fields/has_many/_form.html.erb:26
actionview (7.1.3.2) lib/action_view/base.rb:264:in `public_send'
actionview (7.1.3.2) lib/action_view/base.rb:264:in `_run'
actionview (7.1.3.2) lib/action_view/template.rb:261:in `block in render'
activesupport (7.1.3.2) lib/active_support/notifications.rb:208:in `instrument'
actionview (7.1.3.2) lib/action_view/template.rb:549:in `instrument_render_template'
actionview (7.1.3.2) lib/action_view/template.rb:249:in `render'
actionview (7.1.3.2) lib/action_view/renderer/partial_renderer.rb:252:in `block in render_partial_template'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `block in instrument'
activesupport (7.1.3.2) lib/active_support/notifications/instrumenter.rb:58:in `instrument'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `instrument'
actionview (7.1.3.2) lib/action_view/renderer/partial_renderer.rb:246:in `render_partial_template'
actionview (7.1.3.2) lib/action_view/renderer/partial_renderer.rb:237:in `render'
actionview (7.1.3.2) lib/action_view/renderer/renderer.rb:83:in `render_partial_to_object'
actionview (7.1.3.2) lib/action_view/renderer/renderer.rb:29:in `render_to_object'
actionview (7.1.3.2) lib/action_view/renderer/renderer.rb:24:in `render'
actionview (7.1.3.2) lib/action_view/helpers/rendering_helper.rb:37:in `block in render'
actionview (7.1.3.2) lib/action_view/base.rb:291:in `in_rendering_context'
actionview (7.1.3.2) lib/action_view/helpers/rendering_helper.rb:33:in `render'
administrate (1.0.0.beta1) app/helpers/administrate/application_helper.rb:12:in `render_field'
administrate (1.0.0.beta1) app/views/administrate/application/_form.html.erb:44
administrate (1.0.0.beta1) app/views/administrate/application/_form.html.erb:42:in `each'
administrate (1.0.0.beta1) app/views/administrate/application/_form.html.erb:42
administrate (1.0.0.beta1) app/views/administrate/application/_form.html.erb:36:in `each'
administrate (1.0.0.beta1) app/views/administrate/application/_form.html.erb:36
actionview (7.1.3.2) lib/action_view/helpers/capture_helper.rb:50:in `block in capture'
actionview (7.1.3.2) lib/action_view/buffers.rb:75:in `capture'
actionview (7.1.3.2) lib/action_view/helpers/capture_helper.rb:50:in `capture'
actionview (7.1.3.2) lib/action_view/helpers/form_helper.rb:773:in `form_with'
actionview (7.1.3.2) lib/action_view/helpers/form_helper.rb:461:in `form_for'
administrate (1.0.0.beta1) app/views/administrate/application/_form.html.erb:17
actionview (7.1.3.2) lib/action_view/base.rb:264:in `public_send'
actionview (7.1.3.2) lib/action_view/base.rb:264:in `_run'
actionview (7.1.3.2) lib/action_view/template.rb:261:in `block in render'
activesupport (7.1.3.2) lib/active_support/notifications.rb:208:in `instrument'
actionview (7.1.3.2) lib/action_view/template.rb:549:in `instrument_render_template'
actionview (7.1.3.2) lib/action_view/template.rb:249:in `render'
actionview (7.1.3.2) lib/action_view/renderer/partial_renderer.rb:252:in `block in render_partial_template'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `block in instrument'
activesupport (7.1.3.2) lib/active_support/notifications/instrumenter.rb:58:in `instrument'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `instrument'
actionview (7.1.3.2) lib/action_view/renderer/partial_renderer.rb:246:in `render_partial_template'
actionview (7.1.3.2) lib/action_view/renderer/partial_renderer.rb:237:in `render'
actionview (7.1.3.2) lib/action_view/renderer/renderer.rb:83:in `render_partial_to_object'
actionview (7.1.3.2) lib/action_view/renderer/renderer.rb:55:in `render_partial'
actionview (7.1.3.2) lib/action_view/helpers/rendering_helper.rb:44:in `render'
administrate (1.0.0.beta1) app/views/administrate/application/edit.html.erb:35
actionview (7.1.3.2) lib/action_view/base.rb:264:in `public_send'
actionview (7.1.3.2) lib/action_view/base.rb:264:in `_run'
actionview (7.1.3.2) lib/action_view/template.rb:261:in `block in render'
activesupport (7.1.3.2) lib/active_support/notifications.rb:208:in `instrument'
actionview (7.1.3.2) lib/action_view/template.rb:549:in `instrument_render_template'
actionview (7.1.3.2) lib/action_view/template.rb:249:in `render'
actionview (7.1.3.2) lib/action_view/renderer/template_renderer.rb:66:in `block (2 levels) in render_template'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `block in instrument'
activesupport (7.1.3.2) lib/active_support/notifications/instrumenter.rb:58:in `instrument'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `instrument'
actionview (7.1.3.2) lib/action_view/renderer/template_renderer.rb:60:in `block in render_template'
actionview (7.1.3.2) lib/action_view/renderer/template_renderer.rb:76:in `block in render_with_layout'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `block in instrument'
activesupport (7.1.3.2) lib/active_support/notifications/instrumenter.rb:58:in `instrument'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `instrument'
actionview (7.1.3.2) lib/action_view/renderer/template_renderer.rb:75:in `render_with_layout'
actionview (7.1.3.2) lib/action_view/renderer/template_renderer.rb:59:in `render_template'
actionview (7.1.3.2) lib/action_view/renderer/template_renderer.rb:11:in `render'
actionview (7.1.3.2) lib/action_view/renderer/renderer.rb:63:in `render_template_to_object'
actionview (7.1.3.2) lib/action_view/renderer/renderer.rb:31:in `render_to_object'
actionview (7.1.3.2) lib/action_view/rendering.rb:135:in `block in _render_template'
actionview (7.1.3.2) lib/action_view/base.rb:291:in `in_rendering_context'
actionview (7.1.3.2) lib/action_view/rendering.rb:134:in `_render_template'
actionpack (7.1.3.2) lib/action_controller/metal/streaming.rb:256:in `_render_template'
actionview (7.1.3.2) lib/action_view/rendering.rb:121:in `render_to_body'
actionpack (7.1.3.2) lib/action_controller/metal/rendering.rb:158:in `render_to_body'
actionpack (7.1.3.2) lib/action_controller/metal/renderers.rb:141:in `render_to_body'
actionpack (7.1.3.2) lib/abstract_controller/rendering.rb:27:in `render'
actionpack (7.1.3.2) lib/action_controller/metal/rendering.rb:139:in `render'
actionpack (7.1.3.2) lib/action_controller/metal/instrumentation.rb:29:in `block (2 levels) in render'
/Users/adamr/.asdf/installs/ruby/3.3.0/lib/ruby/3.3.0/benchmark.rb:313:in `realtime'
activesupport (7.1.3.2) lib/active_support/core_ext/benchmark.rb:14:in `ms'
actionpack (7.1.3.2) lib/action_controller/metal/instrumentation.rb:29:in `block in render'
actionpack (7.1.3.2) lib/action_controller/metal/instrumentation.rb:98:in `cleanup_view_runtime'
activerecord (7.1.3.2) lib/active_record/railties/controller_runtime.rb:39:in `cleanup_view_runtime'
actionpack (7.1.3.2) lib/action_controller/metal/instrumentation.rb:28:in `render'
administrate (1.0.0.beta1) app/controllers/administrate/application_controller.rb:37:in `edit'
actionpack (7.1.3.2) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (7.1.3.2) lib/abstract_controller/base.rb:224:in `process_action'
actionpack (7.1.3.2) lib/action_controller/metal/rendering.rb:165:in `process_action'
actionpack (7.1.3.2) lib/abstract_controller/callbacks.rb:259:in `block in process_action'
activesupport (7.1.3.2) lib/active_support/callbacks.rb:121:in `block in run_callbacks'
actiontext (7.1.3.2) lib/action_text/rendering.rb:23:in `with_renderer'
actiontext (7.1.3.2) lib/action_text/engine.rb:69:in `block (4 levels) in <class:Engine>'
activesupport (7.1.3.2) lib/active_support/callbacks.rb:130:in `instance_exec'
activesupport (7.1.3.2) lib/active_support/callbacks.rb:130:in `block in run_callbacks'
activesupport (7.1.3.2) lib/active_support/callbacks.rb:141:in `run_callbacks'
actionpack (7.1.3.2) lib/abstract_controller/callbacks.rb:258:in `process_action'
actionpack (7.1.3.2) lib/action_controller/metal/rescue.rb:25:in `process_action'
actionpack (7.1.3.2) lib/action_controller/metal/instrumentation.rb:74:in `block in process_action'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `block in instrument'
activesupport (7.1.3.2) lib/active_support/notifications/instrumenter.rb:58:in `instrument'
activesupport (7.1.3.2) lib/active_support/notifications.rb:206:in `instrument'
actionpack (7.1.3.2) lib/action_controller/metal/instrumentation.rb:73:in `process_action'
actionpack (7.1.3.2) lib/action_controller/metal/params_wrapper.rb:261:in `process_action'
activerecord (7.1.3.2) lib/active_record/railties/controller_runtime.rb:32:in `process_action'
actionpack (7.1.3.2) lib/abstract_controller/base.rb:160:in `process'
actionview (7.1.3.2) lib/action_view/rendering.rb:40:in `process'
actionpack (7.1.3.2) lib/action_controller/metal.rb:227:in `dispatch'
actionpack (7.1.3.2) lib/action_controller/metal.rb:309:in `dispatch'
actionpack (7.1.3.2) lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack (7.1.3.2) lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack (7.1.3.2) lib/action_dispatch/journey/router.rb:51:in `block in serve'
actionpack (7.1.3.2) lib/action_dispatch/journey/router.rb:131:in `block in find_routes'
actionpack (7.1.3.2) lib/action_dispatch/journey/router.rb:124:in `each'
actionpack (7.1.3.2) lib/action_dispatch/journey/router.rb:124:in `find_routes'
actionpack (7.1.3.2) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (7.1.3.2) lib/action_dispatch/routing/route_set.rb:882:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/static.rb:25:in `call'
rack (3.0.9.1) lib/rack/tempfile_reaper.rb:20:in `call'
rack (3.0.9.1) lib/rack/etag.rb:29:in `call'
rack (3.0.9.1) lib/rack/conditional_get.rb:31:in `call'
rack (3.0.9.1) lib/rack/head.rb:15:in `call'
actionpack (7.1.3.2) lib/action_dispatch/http/permissions_policy.rb:36:in `call'
actionpack (7.1.3.2) lib/action_dispatch/http/content_security_policy.rb:33:in `call'
rack-session (2.0.0) lib/rack/session/abstract/id.rb:272:in `context'
rack-session (2.0.0) lib/rack/session/abstract/id.rb:266:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/cookies.rb:689:in `call'
activerecord (7.1.3.2) lib/active_record/migration.rb:655:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (7.1.3.2) lib/active_support/callbacks.rb:101:in `run_callbacks'
actionpack (7.1.3.2) lib/action_dispatch/middleware/callbacks.rb:28:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/actionable_exceptions.rb:16:in `call'
appsignal (3.6.0) lib/appsignal/rack/rails_instrumentation.rb:20:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
web-console (4.2.1) lib/web_console/middleware.rb:132:in `call_app'
web-console (4.2.1) lib/web_console/middleware.rb:28:in `block in call'
web-console (4.2.1) lib/web_console/middleware.rb:17:in `catch'
web-console (4.2.1) lib/web_console/middleware.rb:17:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
railties (7.1.3.2) lib/rails/rack/logger.rb:37:in `call_app'
railties (7.1.3.2) lib/rails/rack/logger.rb:24:in `block in call'
activesupport (7.1.3.2) lib/active_support/tagged_logging.rb:135:in `block in tagged'
activesupport (7.1.3.2) lib/active_support/tagged_logging.rb:39:in `tagged'
activesupport (7.1.3.2) lib/active_support/tagged_logging.rb:135:in `tagged'
activesupport (7.1.3.2) lib/active_support/broadcast_logger.rb:240:in `method_missing'
railties (7.1.3.2) lib/rails/rack/logger.rb:24:in `call'
propshaft (0.8.0) lib/propshaft/quiet_assets.rb:11:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/remote_ip.rb:92:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/request_id.rb:28:in `call'
rack (3.0.9.1) lib/rack/method_override.rb:28:in `call'
rack (3.0.9.1) lib/rack/runtime.rb:24:in `call'
activesupport (7.1.3.2) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/server_timing.rb:59:in `block in call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/server_timing.rb:24:in `collect_events'
actionpack (7.1.3.2) lib/action_dispatch/middleware/server_timing.rb:58:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/static.rb:25:in `call'
rack (3.0.9.1) lib/rack/sendfile.rb:114:in `call'
actionpack (7.1.3.2) lib/action_dispatch/middleware/host_authorization.rb:141:in `call'
rack-mini-profiler (3.3.1) lib/mini_profiler.rb:334:in `call'
vite_ruby (3.5.0) lib/vite_ruby/dev_server_proxy.rb:22:in `perform_request'
rack-proxy (0.7.7) lib/rack/proxy.rb:87:in `call'
railties (7.1.3.2) lib/rails/engine.rb:536:in `call'
puma (6.4.2) lib/puma/configuration.rb:272:in `call'
puma (6.4.2) lib/puma/request.rb:100:in `block in handle_request'
puma (6.4.2) lib/puma/thread_pool.rb:378:in `with_force_shutdown'
puma (6.4.2) lib/puma/request.rb:99:in `handle_request'
puma (6.4.2) lib/puma/server.rb:464:in `process_client'
puma (6.4.2) lib/puma/server.rb:245:in `block in run'
puma (6.4.2) lib/puma/thread_pool.rb:155:in `block in spawn_thread'
@HashNotAdam HashNotAdam added the bug breakages in functionality that is implemented label Apr 3, 2024
@pablobm
Copy link
Collaborator

pablobm commented Jul 19, 2024

Thank you for raising this. My current impression is that this cannot be avoided automatically, and it's on Administrate users to ensure that these relationships are loaded correctly. After all, that's generally the case when strict loading is in effect.

Fortunately, the fix should be straightforward: eager load the appropriate relationships, for example using the scoped_resource hook.

I have an example app where Thing.has_many :parts. To avoid this issue, I added the following lines:

# app/controllers/admin/things_controller.rb
...
    def scoped_resource
      super.includes(:parts)
    end
...

And:

# app/controllers/admin/parts_controller.rb
...
    def scoped_resource
      super.includes(:thing)
    end
...

Now the relationship is loaded explicitly and will not cause an issue when strict loading.

I'm going to close this now, but please do let use know if you have any feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug breakages in functionality that is implemented
Projects
None yet
Development

No branches or pull requests

2 participants