avo-hq / avo

Build Ruby on Rails apps 10x faster
https://avohq.io
Other
1.51k stars 242 forks source link

Regular and Standalone actions throw exceptions when they are run #2437

Closed Reizar closed 8 months ago

Reizar commented 8 months ago

Describe the bug

This is a weird situation for us, as this has only just started happening, but nothing in avo was changed ( that we can think of ) prior to this starting to happen.

This first started happening in v2, so I decided to finally upgrade to v3 today and it is still happening.

When trying to run a standalone action, or a model based action, I am running into exceptions and the actions don't run ( the pop up modal is not shown at all ).

However different exceptions are thrown for each.

Steps to Reproduce

Steps to reproduce the behavior:

  1. Add the actions below.
  2. Choose to run one from within the resource page.
  3. Error is shown

Expected behavior & Actual behavior

Expected: Action modal is shown Actual: Nothing is shown and exception is thrown

Models and resource files

Note this is happening for every resource / action in our Avo app, but I've just included one to showcase the issue.

Resource:

class Avo::Resources::User < Avo::BaseResource
  self.title = :name
  self.includes = []
  self.search = {
    query: -> { query.ransack(name_cont: params[:q], email_cont: params[:q], m: "or").result(distinct: false) },
    item: -> do
      {
        title: record.name,
        description: record.email,
        image_url: record.avatar_url
      }
    end
  }

  def fields
    field :id, as: :id
    field :avatar, as: :external_image, link_to_resource: true, is_image: true, as_avatar: :circle do
      MediaUrlGenerator.generate(record.avatar, width: 256, height: 256, quality: 75)
    end
    field :name, as: :text, required: true
    field :email, as: :text, as_description: true, required: true
    field :unconfirmed_email, as: :text, only_on: [:show]

    field :phone_number, as: :text, only_on: [:show, :forms]

    field :created_at, as: :date_time, only_on: [:index, :show], sortable: true, format: LUXON_DATE_FORMAT

    field :updated_at, as: :date_time, only_on: [:show], format: LUXON_DATE_FORMAT

    field :properties, as: :has_many
  end

  def filters
    filter Avo::Filters::UserTypeFilter
  end

  def actions
    action Avo::Actions::ChangeUserEmail    
    action Avo::Actions::ResetDemoAccount
  end
end

Standalone Action:

class Avo::Actions::ResetDemoAccount < Avo::BaseAction
  self.name = "Reset demo account"
  self.standalone = true
  self.confirm_button_label = "Confirm"

  def handle(**kwargs)
    Demos::ResetDemoUserJob.perform_later

    succeed "Action ran successfully, watch slack to see when its complete."
  end
end

Standalone action exception:

 Started GET "/avo/resources/users/actions?action_id=Avo::Actions::ResetDemoAccount" for 127.0.0.1 at 2024-02-01 14:08:39 +1300
 Processing by Avo::ActionsController#show as HTML
   Parameters: {"action_id"=>"Avo::Actions::ResetDemoAccount", "resource_name"=>"users"}
   AdminUser Load (0.4ms)  SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = $1 ORDER BY "admin_users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
 Completed 404 Not Found in 42ms (ActiveRecord: 0.4ms | Allocations: 11252)

 ActiveRecord::RecordNotFound (Couldn't find User without an ID):

 activerecord (7.0.8) lib/active_record/relation/finder_methods.rb:455:in `find_with_ids'
 activerecord (7.0.8) lib/active_record/relation/finder_methods.rb:69:in `find'
 avo (3.3.3) lib/avo/base_resource.rb:62:in `block in <class:BaseResource>'
 avo (3.3.3) lib/avo/execution_context.rb:41:in `instance_exec'
 avo (3.3.3) lib/avo/execution_context.rb:41:in `handle'
 avo (3.3.3) lib/avo/base_resource.rb:216:in `find_record'
 avo (3.3.3) lib/avo/base_resource.rb:235:in `find_record'
 avo (3.3.3) app/controllers/avo/application_controller.rb:145:in `set_record'
 activesupport (7.0.8) lib/active_support/callbacks.rb:400:in `block in make_lambda'
 activesupport (7.0.8) lib/active_support/callbacks.rb:180:in `block (2 levels) in halting_and_conditional'
 actionpack (7.0.8) lib/abstract_controller/callbacks.rb:34:in `block (2 levels) in <module:Callbacks>'
 activesupport (7.0.8) lib/active_support/callbacks.rb:181:in `block in halting_and_conditional'
 activesupport (7.0.8) lib/active_support/callbacks.rb:595:in `block in invoke_before'
 activesupport (7.0.8) lib/active_support/callbacks.rb:595:in `each'
 activesupport (7.0.8) lib/active_support/callbacks.rb:595:in `invoke_before'
 activesupport (7.0.8) lib/active_support/callbacks.rb:116:in `block in run_callbacks'
 i18n (1.14.1) lib/i18n.rb:322:in `with_locale'
 avo (3.3.3) app/controllers/avo/application_controller.rb:263:in `set_avo_locale'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 audited (5.4.2) lib/audited/sweeper.rb:16:in `around'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 audited (5.4.2) lib/audited/sweeper.rb:16:in `around'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 graphiti-rails (0.4.0) lib/graphiti/rails/debugging.rb:13:in `block in debug_graphiti'
 graphiti (1.3.9) lib/graphiti/debugger.rb:110:in `debug'
 graphiti-rails (0.4.0) lib/graphiti/rails/debugging.rb:12:in `debug_graphiti'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 graphiti-rails (0.4.0) lib/graphiti/rails/context.rb:17:in `block in wrap_graphiti_context'
 graphiti (1.3.9) lib/graphiti.rb:33:in `with_context'
 graphiti-rails (0.4.0) lib/graphiti/rails/context.rb:16:in `wrap_graphiti_context'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 activesupport (7.0.8) lib/active_support/callbacks.rb:138:in `run_callbacks'
 actionpack (7.0.8) lib/abstract_controller/callbacks.rb:233:in `process_action'
 actionpack (7.0.8) lib/action_controller/metal/rescue.rb:23:in `process_action'
 actionpack (7.0.8) lib/action_controller/metal/instrumentation.rb:67:in `block in process_action'
 activesupport (7.0.8) lib/active_support/notifications.rb:206:in `block in instrument'
 activesupport (7.0.8) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
 activesupport (7.0.8) lib/active_support/notifications.rb:206:in `instrument'
 actionpack (7.0.8) lib/action_controller/metal/instrumentation.rb:66:in `process_action'
 actionpack (7.0.8) lib/action_controller/metal/params_wrapper.rb:259:in `process_action'
 searchkick (5.3.1) lib/searchkick/controller_runtime.rb:15:in `process_action'
 rescue_registry (1.0.0) lib/rescue_registry/controller.rb:24:in `process_action'
 activerecord (7.0.8) lib/active_record/railties/controller_runtime.rb:27:in `process_action'
 actionpack (7.0.8) lib/abstract_controller/base.rb:151:in `process'
 actionview (7.0.8) lib/action_view/rendering.rb:39:in `process'
 actionpack (7.0.8) lib/action_controller/metal.rb:188:in `dispatch'
 actionpack (7.0.8) lib/action_controller/metal.rb:251:in `dispatch'
 actionpack (7.0.8) lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
 actionpack (7.0.8) lib/action_dispatch/routing/route_set.rb:32:in `serve'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:50:in `block in serve'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:32:in `each'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:32:in `serve'
 actionpack (7.0.8) lib/action_dispatch/routing/route_set.rb:852:in `call'
 railties (7.0.8) lib/rails/engine.rb:530:in `call'
 railties (7.0.8) lib/rails/railtie.rb:226:in `public_send'
 railties (7.0.8) lib/rails/railtie.rb:226:in `method_missing'
 actionpack (7.0.8) lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
 actionpack (7.0.8) lib/action_dispatch/routing/mapper.rb:48:in `serve'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:50:in `block in serve'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:32:in `each'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:32:in `serve'
 actionpack (7.0.8) lib/action_dispatch/routing/route_set.rb:852:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/static.rb:23:in `call'
 rack (2.2.8) lib/rack/session/abstract/id.rb:266:in `context'
 rack (2.2.8) lib/rack/session/abstract/id.rb:260:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/cookies.rb:704:in `call'
 rack (2.2.8) lib/rack/method_override.rb:24:in `call'
 warden (1.2.9) lib/warden/manager.rb:36:in `block in call'
 warden (1.2.9) lib/warden/manager.rb:34:in `catch'
 warden (1.2.9) lib/warden/manager.rb:34:in `call'
 rack (2.2.8) lib/rack/static.rb:161:in `call'
 rack (2.2.8) lib/rack/static.rb:161:in `call'
 rack (2.2.8) lib/rack/static.rb:161:in `call'
 rack (2.2.8) lib/rack/etag.rb:27:in `call'
 rack (2.2.8) lib/rack/conditional_get.rb:27:in `call'
 rack (2.2.8) lib/rack/head.rb:12:in `call'
 activerecord (7.0.8) lib/active_record/migration.rb:638:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
 activesupport (7.0.8) lib/active_support/callbacks.rb:99:in `run_callbacks'
 actionpack (7.0.8) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/executor.rb:14:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/show_exceptions.rb:29:in `call'
 rescue_registry (1.0.0) lib/rescue_registry/action_dispatch/show_exceptions.rb:11:in `call'
 rescue_registry (1.0.0) lib/rescue_registry/reset_context.rb:9:in `call'
 railties (7.0.8) lib/rails/rack/logger.rb:40:in `call_app'
 railties (7.0.8) lib/rails/rack/logger.rb:25:in `block in call'
 activesupport (7.0.8) lib/active_support/tagged_logging.rb:99:in `block in tagged'
 activesupport (7.0.8) lib/active_support/tagged_logging.rb:37:in `tagged'
 activesupport (7.0.8) lib/active_support/tagged_logging.rb:99:in `tagged'
 railties (7.0.8) lib/rails/rack/logger.rb:25:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
 request_store (1.5.1) lib/request_store/middleware.rb:19:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/request_id.rb:26:in `call'
 rack (2.2.8) lib/rack/runtime.rb:22:in `call'
 activesupport (7.0.8) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/executor.rb:14:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/static.rb:23:in `call'
 rack (2.2.8) lib/rack/sendfile.rb:110:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/host_authorization.rb:138:in `call'
 rack-cors (2.0.1) lib/rack/cors.rb:102:in `call'
 railties (7.0.8) lib/rails/engine.rb:530:in `call'
 puma (6.4.1) lib/puma/configuration.rb:272:in `call'
 puma (6.4.1) lib/puma/request.rb:100:in `block in handle_request'
 puma (6.4.1) lib/puma/thread_pool.rb:378:in `with_force_shutdown'
 puma (6.4.1) lib/puma/request.rb:99:in `handle_request'
 puma (6.4.1) lib/puma/server.rb:464:in `process_client'
 puma (6.4.1) lib/puma/server.rb:245:in `block in run'
 puma (6.4.1) lib/puma/thread_pool.rb:155:in `block in spawn_thread'

Regular Action:

class Avo::Actions::ChangeUserEmail < Avo::BaseAction
  self.name = "Change user email"
  self.message = "This will change and confirm the user's email address"

  def fields
    field :email, as: :text, required: true
  end

  def handle(**args)
    records, fields = args.values_at(:records, :fields)

    records = T.let(records.flatten, T::Array[User])
    return error "No users selected" if records.empty?
    return error "Can only be done with one user at a time" if records.length > 1

    records.each do |record|
      record.email = fields["email"]
      record.skip_reconfirmation!
      record.save
    end
  end
end

Regular Action Exception:

 Started GET "/avo/resources/users/3666/actions?action_id=Avo::Actions::ChangeUserEmail" for 127.0.0.1 at 2024-02-01 14:13:39 +1300
 Processing by Avo::ActionsController#show as HTML
   Parameters: {"action_id"=>"Avo::Actions::ChangeUserEmail", "resource_name"=>"users", "id"=>"3666"}
   AdminUser Load (0.2ms)  SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = $1 ORDER BY "admin_users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
   User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 3666], ["LIMIT", 1]]
   Rendering layout /Users/aaron/.rvm/gems/ruby-3.3.0/gems/turbo-rails-1.5.0/app/views/layouts/turbo_rails/frame.html.erb
   Rendering /Users/aaron/.rvm/gems/ruby-3.3.0/gems/avo-3.3.3/app/views/avo/actions/show.html.erb within layouts/turbo_rails/frame
   Rendered /Users/aaron/.rvm/gems/ruby-3.3.0/gems/avo-3.3.3/app/views/avo/actions/show.html.erb within layouts/turbo_rails/frame (Duration: 0.2ms | Allocations: 191)
   Rendered layout /Users/aaron/.rvm/gems/ruby-3.3.0/gems/turbo-rails-1.5.0/app/views/layouts/turbo_rails/frame.html.erb (Duration: 0.3ms | Allocations: 264)
 Completed 500 Internal Server Error in 21ms (ActiveRecord: 0.6ms | Allocations: 20258)

 ActionView::Template::Error (undefined method `get_stimulus_controllers' for nil):
     1: <%= turbo_frame_tag "actions_show" do %>
     2:   <div
     3:     data-controller="<%= ["action", @action.get_stimulus_controllers].join(" ") %>"
     4:     data-no-confirmation="<%= @action.no_confirmation %>"
     5:     data-action-target="controllerDiv"
     6:     data-resource-name="<%= @resource.model_key %>"

 avo (3.3.3) app/views/avo/actions/show.html.erb:3
 actionview (7.0.8) lib/action_view/helpers/capture_helper.rb:45:in `block in capture'
 actionview (7.0.8) lib/action_view/helpers/capture_helper.rb:209:in `with_output_buffer'
 actionview (7.0.8) lib/action_view/helpers/capture_helper.rb:45:in `capture'
 actionview (7.0.8) lib/action_view/helpers/tag_helper.rb:71:in `tag_string'
 actionview (7.0.8) lib/action_view/helpers/tag_helper.rb:189:in `method_missing'
 turbo-rails (1.5.0) app/helpers/turbo/frames_helper.rb:42:in `turbo_frame_tag'
 avo (3.3.3) app/views/avo/actions/show.html.erb:1
 actionview (7.0.8) lib/action_view/base.rb:244:in `public_send'
 actionview (7.0.8) lib/action_view/base.rb:244:in `_run'
 actionview (7.0.8) lib/action_view/template.rb:157:in `block in render'
 activesupport (7.0.8) lib/active_support/notifications.rb:208:in `instrument'
 actionview (7.0.8) lib/action_view/template.rb:361:in `instrument_render_template'
 actionview (7.0.8) lib/action_view/template.rb:155:in `render'
 actionview (7.0.8) lib/action_view/renderer/template_renderer.rb:65:in `block (2 levels) in render_template'
 activesupport (7.0.8) lib/active_support/notifications.rb:206:in `block in instrument'
 activesupport (7.0.8) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
 activesupport (7.0.8) lib/active_support/notifications.rb:206:in `instrument'
 actionview (7.0.8) lib/action_view/renderer/template_renderer.rb:60:in `block in render_template'
 actionview (7.0.8) lib/action_view/renderer/template_renderer.rb:75:in `block in render_with_layout'
 activesupport (7.0.8) lib/active_support/notifications.rb:206:in `block in instrument'
 activesupport (7.0.8) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
 activesupport (7.0.8) lib/active_support/notifications.rb:206:in `instrument'
 actionview (7.0.8) lib/action_view/renderer/template_renderer.rb:74:in `render_with_layout'
 actionview (7.0.8) lib/action_view/renderer/template_renderer.rb:59:in `render_template'
 actionview (7.0.8) lib/action_view/renderer/template_renderer.rb:11:in `render'
 actionview (7.0.8) lib/action_view/renderer/renderer.rb:61:in `render_template_to_object'
 actionview (7.0.8) lib/action_view/renderer/renderer.rb:29:in `render_to_object'
 actionview (7.0.8) lib/action_view/rendering.rb:117:in `block in _render_template'
 actionview (7.0.8) lib/action_view/base.rb:270:in `in_rendering_context'
 actionview (7.0.8) lib/action_view/rendering.rb:116:in `_render_template'
 actionpack (7.0.8) lib/action_controller/metal/streaming.rb:216:in `_render_template'
 actionview (7.0.8) lib/action_view/rendering.rb:103:in `render_to_body'
 actionpack (7.0.8) lib/action_controller/metal/rendering.rb:158:in `render_to_body'
 actionpack (7.0.8) lib/action_controller/metal/renderers.rb:141:in `render_to_body'
 actionpack (7.0.8) lib/abstract_controller/rendering.rb:27:in `render'
 actionpack (7.0.8) lib/action_controller/metal/rendering.rb:139:in `render'
 actionpack (7.0.8) lib/action_controller/metal/instrumentation.rb:22:in `block (2 levels) in render'
 /Users/aaron/.rvm/rubies/ruby-3.3.0/lib/ruby/3.3.0/benchmark.rb:313:in `realtime'
 activesupport (7.0.8) lib/active_support/core_ext/benchmark.rb:14:in `ms'
 actionpack (7.0.8) lib/action_controller/metal/instrumentation.rb:22:in `block in render'
 actionpack (7.0.8) lib/action_controller/metal/instrumentation.rb:91:in `cleanup_view_runtime'
 searchkick (5.3.1) lib/searchkick/controller_runtime.rb:20:in `cleanup_view_runtime'
 activerecord (7.0.8) lib/active_record/railties/controller_runtime.rb:34:in `cleanup_view_runtime'
 actionpack (7.0.8) lib/action_controller/metal/instrumentation.rb:21:in `render'
 meta-tags (2.20.0) lib/meta_tags/controller_helper.rb:22:in `render'
 wicked_pdf (2.7.0) lib/wicked_pdf/pdf_helper.rb:18:in `render'
 actionpack (7.0.8) lib/action_controller/metal/implicit_render.rb:35:in `default_render'
 actionpack (7.0.8) lib/action_controller/metal/basic_implicit_render.rb:7:in `send_action'
 actionpack (7.0.8) lib/abstract_controller/base.rb:215:in `process_action'
 actionpack (7.0.8) lib/action_controller/metal/rendering.rb:165:in `process_action'
 actionpack (7.0.8) lib/abstract_controller/callbacks.rb:234:in `block in process_action'
 activesupport (7.0.8) lib/active_support/callbacks.rb:118:in `block in run_callbacks'
 i18n (1.14.1) lib/i18n.rb:322:in `with_locale'
 avo (3.3.3) app/controllers/avo/application_controller.rb:263:in `set_avo_locale'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 audited (5.4.2) lib/audited/sweeper.rb:16:in `around'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 audited (5.4.2) lib/audited/sweeper.rb:16:in `around'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 graphiti-rails (0.4.0) lib/graphiti/rails/debugging.rb:13:in `block in debug_graphiti'
 graphiti (1.3.9) lib/graphiti/debugger.rb:110:in `debug'
 graphiti-rails (0.4.0) lib/graphiti/rails/debugging.rb:12:in `debug_graphiti'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 graphiti-rails (0.4.0) lib/graphiti/rails/context.rb:17:in `block in wrap_graphiti_context'
 graphiti (1.3.9) lib/graphiti.rb:33:in `with_context'
 graphiti-rails (0.4.0) lib/graphiti/rails/context.rb:16:in `wrap_graphiti_context'
 activesupport (7.0.8) lib/active_support/callbacks.rb:127:in `block in run_callbacks'
 activesupport (7.0.8) lib/active_support/callbacks.rb:138:in `run_callbacks'
 actionpack (7.0.8) lib/abstract_controller/callbacks.rb:233:in `process_action'
 actionpack (7.0.8) lib/action_controller/metal/rescue.rb:23:in `process_action'
 actionpack (7.0.8) lib/action_controller/metal/instrumentation.rb:67:in `block in process_action'
 activesupport (7.0.8) lib/active_support/notifications.rb:206:in `block in instrument'
 activesupport (7.0.8) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
 activesupport (7.0.8) lib/active_support/notifications.rb:206:in `instrument'
 actionpack (7.0.8) lib/action_controller/metal/instrumentation.rb:66:in `process_action'
 actionpack (7.0.8) lib/action_controller/metal/params_wrapper.rb:259:in `process_action'
 searchkick (5.3.1) lib/searchkick/controller_runtime.rb:15:in `process_action'
 rescue_registry (1.0.0) lib/rescue_registry/controller.rb:24:in `process_action'
 activerecord (7.0.8) lib/active_record/railties/controller_runtime.rb:27:in `process_action'
 actionpack (7.0.8) lib/abstract_controller/base.rb:151:in `process'
 actionview (7.0.8) lib/action_view/rendering.rb:39:in `process'
 actionpack (7.0.8) lib/action_controller/metal.rb:188:in `dispatch'
 actionpack (7.0.8) lib/action_controller/metal.rb:251:in `dispatch'
 actionpack (7.0.8) lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
 actionpack (7.0.8) lib/action_dispatch/routing/route_set.rb:32:in `serve'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:50:in `block in serve'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:32:in `each'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:32:in `serve'
 actionpack (7.0.8) lib/action_dispatch/routing/route_set.rb:852:in `call'
 railties (7.0.8) lib/rails/engine.rb:530:in `call'
 railties (7.0.8) lib/rails/railtie.rb:226:in `public_send'
 railties (7.0.8) lib/rails/railtie.rb:226:in `method_missing'
 actionpack (7.0.8) lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
 actionpack (7.0.8) lib/action_dispatch/routing/mapper.rb:48:in `serve'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:50:in `block in serve'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:32:in `each'
 actionpack (7.0.8) lib/action_dispatch/journey/router.rb:32:in `serve'
 actionpack (7.0.8) lib/action_dispatch/routing/route_set.rb:852:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/static.rb:23:in `call'
 rack (2.2.8) lib/rack/session/abstract/id.rb:266:in `context'
 rack (2.2.8) lib/rack/session/abstract/id.rb:260:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/cookies.rb:704:in `call'
 rack (2.2.8) lib/rack/method_override.rb:24:in `call'
 warden (1.2.9) lib/warden/manager.rb:36:in `block in call'
 warden (1.2.9) lib/warden/manager.rb:34:in `catch'
 warden (1.2.9) lib/warden/manager.rb:34:in `call'
 rack (2.2.8) lib/rack/static.rb:161:in `call'
 rack (2.2.8) lib/rack/static.rb:161:in `call'
 rack (2.2.8) lib/rack/static.rb:161:in `call'
 rack (2.2.8) lib/rack/etag.rb:27:in `call'
 rack (2.2.8) lib/rack/conditional_get.rb:27:in `call'
 rack (2.2.8) lib/rack/head.rb:12:in `call'
 activerecord (7.0.8) lib/active_record/migration.rb:638:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
 activesupport (7.0.8) lib/active_support/callbacks.rb:99:in `run_callbacks'
 actionpack (7.0.8) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/executor.rb:14:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/show_exceptions.rb:29:in `call'
 rescue_registry (1.0.0) lib/rescue_registry/action_dispatch/show_exceptions.rb:11:in `call'
 rescue_registry (1.0.0) lib/rescue_registry/reset_context.rb:9:in `call'
 railties (7.0.8) lib/rails/rack/logger.rb:40:in `call_app'
 railties (7.0.8) lib/rails/rack/logger.rb:25:in `block in call'
 activesupport (7.0.8) lib/active_support/tagged_logging.rb:99:in `block in tagged'
 activesupport (7.0.8) lib/active_support/tagged_logging.rb:37:in `tagged'
 activesupport (7.0.8) lib/active_support/tagged_logging.rb:99:in `tagged'
 railties (7.0.8) lib/rails/rack/logger.rb:25:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
 request_store (1.5.1) lib/request_store/middleware.rb:19:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/request_id.rb:26:in `call'
 rack (2.2.8) lib/rack/runtime.rb:22:in `call'
 activesupport (7.0.8) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/executor.rb:14:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/static.rb:23:in `call'
 rack (2.2.8) lib/rack/sendfile.rb:110:in `call'
 actionpack (7.0.8) lib/action_dispatch/middleware/host_authorization.rb:138:in `call'
 rack-cors (2.0.1) lib/rack/cors.rb:102:in `call'
 railties (7.0.8) lib/rails/engine.rb:530:in `call'
 puma (6.4.1) lib/puma/configuration.rb:272:in `call'
 puma (6.4.1) lib/puma/request.rb:100:in `block in handle_request'
 puma (6.4.1) lib/puma/thread_pool.rb:378:in `with_force_shutdown'
 puma (6.4.1) lib/puma/request.rb:99:in `handle_request'
 puma (6.4.1) lib/puma/server.rb:464:in `process_client'
 puma (6.4.1) lib/puma/server.rb:245:in `block in run'
 puma (6.4.1) lib/puma/thread_pool.rb:155:in `block in spawn_thread'
 Started GET "/avo/failed_to_load?turbo_frame=actions_show&src=http://localhost:8000/avo/resources/users/3666/actions?action_id=Avo::Actions::ChangeUserEmail" for 127.0.0.1 at 2024-02-01 14:13:39 +1300
 Processing by Avo::HomeController#failed_to_load as HTML
   Parameters: {"turbo_frame"=>"actions_show", "src"=>"http://localhost:8000/avo/resources/users/3666/actions?action_id=Avo::Actions::ChangeUserEmail"}
   AdminUser Load (0.2ms)  SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = $1 ORDER BY "admin_users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
   Rendering layout /Users/aaron/.rvm/gems/ruby-3.3.0/gems/turbo-rails-1.5.0/app/views/layouts/turbo_rails/frame.html.erb
   Rendering /Users/aaron/.rvm/gems/ruby-3.3.0/gems/avo-3.3.3/app/views/avo/home/failed_to_load.html.erb within layouts/turbo_rails/frame
   Rendered /Users/aaron/.rvm/gems/ruby-3.3.0/gems/avo-3.3.3/app/views/avo/home/failed_to_load.html.erb within layouts/turbo_rails/frame (Duration: 3.2ms | Allocations: 2233)
   Rendered layout /Users/aaron/.rvm/gems/ruby-3.3.0/gems/turbo-rails-1.5.0/app/views/layouts/turbo_rails/frame.html.erb (Duration: 3.3ms | Allocations: 2321)
 Completed 200 OK in 19ms (Views: 3.6ms | ActiveRecord: 0.2ms | Allocations: 13947)

System configuration

Avo version: 3.3.3 Rails version: 7.0.8 Ruby version: 3.3.0

License type:

Are you using Avo monkey patches, overriding views or view components?

Screenshots or screen recordings

Additional context

Impact

Urgency

adrianthedev commented 8 months ago

Can you please ensure that you are on latest with every gem.

bundle update avo avo-advanced avo-pro

There's one weird thing that's happening in one use-case. Are you trying to access the action page directly through the URL or first loading the resource index/show page and then open the action? If it's no 1., then, that might happen. I just want to confirm it.

Reizar commented 8 months ago

Hi @adrianthedev ,

All my avo gems are on the latest versions.

I'm first opening the index / show pages, and then running the action from the Actions dropdown. Here's a loom showing what I'm doing: https://www.loom.com/share/89318014ea58412bb15fa2de8177e152

adrianthedev commented 8 months ago

I don't see the regular action in that video.

For the standalone, I see it's failing to find a user from admin_users. What setup do you have there? Where are you querying for that?

Reizar commented 8 months ago

Sorry, heres an updated video showing both a standalone action and a record based one.

Slightly confusing in the first video, but we have an AdminUser model that is used for accessing Avo, and then a User model which is the actual users for our app. I was showing the users resource in that video. The AdminUser query was successful and was setting the user correctly. Its run through devise and plugged into avo.

I've used different resources in this video to make that clearer:

https://www.loom.com/share/d098f9ce07f843a599445f32fa87e6e4

Reizar commented 8 months ago

Hi @adrianthedev ,

Sorry, just wanted to check if there's any more info I could provide or do to help progress this. This is a huge blocker for us and is stopping us from deploying a large update we've been working on.

Thanks

adrianthedev commented 8 months ago

Sorry about the delay. This slipped through the cracks.

A few questions:

  1. Can you please ensure you are using 3.3.3 for every Avo gem? Can you please try 3.3.6 (for all Avo gems) too?
  2. Are you using friendly_id, prefixed_ids or any other mechanism for properties or subscriptions?
  3. Do you have anything in the self.visible method in those actions?
  4. Are you using pundit (or the authorization feature)?
  5. If yes (authorization), does your act_on? method return true for those scenarios? Can you try to hardcode it?
  6. Can you share the CreateDefaultSubscription and action code?

If this information does not yield any resolution, we'll hop on a call and do so troubleshooting together.

Reizar commented 8 months ago

No worries,

  1. I've updated all avo gems to 3.3.6, this is cut out of my Gemfile.lock
    
    GEM
    remote: https://packager.dev/avo-hq/
    specs:
    avo-dashboards (3.3.6)
      avo (>= 3.3.6)
      turbo-rails
      view_component (>= 3.7.0)
      zeitwerk (>= 2.6.12)
    avo-menu (3.3.6)
      avo (>= 3.3.6)
      docile
      dry-initializer
      zeitwerk (>= 2.6.12)
    avo-pro (3.3.6)
      avo (>= 3.3.6)
      avo-dashboards (>= 3.3.6)
      avo-menu (>= 3.3.6)
      zeitwerk (>= 2.6.12)

... GEM remote: https://rubygems.org/ avo (3.3.6) actionview (>= 6.1) active_link_to activerecord (>= 6.1) activesupport (>= 6.1) addressable docile dry-initializer httparty inline_svg meta-tags pagy turbo-rails turbo_power (>= 0.6.0) view_component (>= 3.7.0) zeitwerk (>= 2.6.12)


2. Not using any of those gems or any other gems that change how the models are queried. 
3. Nothing in self.visible
4. I use pundit. 
5. This is my act_on? code ( its in my ApplicationPolicy that all policies inherit from, no subclass overrides it), I tested the method its calling and that returns true, however I also changed it to be a hard coded true value and that still didn't change anything:
```ruby
   def is_admin?
     user.is_a?(AdminUser)
   end

  def act_on?
    is_admin?
  end
  1. This is the CreateDefaultSubscriptionsAction:
class Avo::Actions::CreateSubscriptionsAction < Avo::BaseAction
  self.name = "Create Default Subscriptions"
  self.message = "This will create the CORE and PREMIUM subscriptions for each configured regulatory zone."
  self.standalone = true

  def handle(**args)
    SubscriptionServices::GenerateSubscriptions.new.call
  end
end
adrianthedev commented 8 months ago

Ok. That's weird. Let's have a call and sort this out.

Reizar commented 8 months ago

Hi @adrianthedev ,

Did some more in depth debugging today and I've found the issue. One of those ones where I totally should have realised that this was causing it earlier 😅 .

We added a model recently named "Action", so an avo controller was generated that was named: "Avo::ActionsController", this overwrote the one from avo which means Actions were trying to be loaded as Resources instead which broke all sorts of things.

We don't actually manage this model through Avo, so I just deleted the resource / controller to fix this for now. But I'm sure in the future we can just name the resource something else and manually specify the model it references.

Thanks

adrianthedev commented 8 months ago

All good!

Thanks for doing the deep dive!

pierredemilly commented 3 months ago

@Reizar just had the exact same issue with our Action model (and Avo controller).

Thanks a lot for documenting your issue, you saved me hours of debugging! 🫶

adrianthedev commented 3 months ago

Maybe we need to make some of our controllers private somehow...

Paul-Bob commented 3 months ago

Maybe we need to make some of our controllers private somehow...

Agree, we should use different namespaces for internal and app controllers to avoid naming conflicts. Same for base resource