Class: Ruact::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/ruact/query.rb

Overview

Story 9.4 (route-driven redesign, Phase B) — base class for v2 server QUERIES. Queries are plain classes under ‘app/queries/`; each public instance method defined directly on the subclass is one query:

# app/queries/application_query.rb
class ApplicationQuery < Ruact::Query; end

# app/queries/catalog_query.rb
class CatalogQuery < ApplicationQuery
  def categories
    Category.active.pluck(:id, :name).map { |id, name| { value: id, label: name } }
  end

  def my_categories
    current_user.categories.pluck(:id, :name)
  end
end

# config/routes.rb
Rails.application.routes.draw do
  ruact_queries CatalogQuery   # GET /q/categories, GET /q/myCategories — visible in `rails routes`
end

Per the 2026-06-02 ADR addendum (Decision 2), dispatch goes through an internal gem controller that inherits ‘Ruact.config.query_parent_controller` (default `ApplicationController`) — the host’s REAL callback chain (‘authenticate_user!`, tenant scoping, Pundit) runs BEFORE the query class is instantiated (FR89). The query instance is fresh per request (NFR8) and receives its execution context via the constructor, so `CatalogQuery.new(fake_context).categories` is unit-testable with no Rails boot.

The context accessors below are defined on ‘Ruact::Query` itself, so they are INHERITED by subclasses — they never appear in a subclass’s ‘public_instance_methods(false)`, which is exactly the set the `ruact_queries` routing macro mounts (one named GET route per method).

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context) ⇒ Query

Returns a new instance of Query.

Parameters:



45
46
47
# File 'lib/ruact/query.rb', line 45

def initialize(context)
  @__ruact_context = context
end

Class Method Details

.__ruact_skipped_callbacksArray<Array(Array<Symbol>, Hash)>

The recorded ‘(callbacks, options)` pairs for this query class, consumed by ServerFunctions::QueryDispatch when the dispatch controller is generated. Per-class (not inherited) — a skip describes the queries of the class that declares it.

Returns:

  • (Array<Array(Array<Symbol>, Hash)>)


102
103
104
# File 'lib/ruact/query.rb', line 102

def __ruact_skipped_callbacks
  @__ruact_skipped_callbacks ||= []
end

.ruact_skip_before_action(*callbacks, **options) ⇒ void

This method returns an undefined value.

Story 9.4 AC4 / D1 — per-query callback opt-out (resolves ADR open item 1). Mirrors Rails’ ‘skip_before_action` ergonomics; the recorded skips are applied verbatim to THIS query class’s generated dispatch controller when ‘ruact_queries` draws its routes, so the opt-out never leaks to other query classes:

class PublicCatalogQuery < ApplicationQuery
  ruact_skip_before_action :authenticate_user!

  def categories = Category.pluck(:id, :name)
end

Options are forwarded to ‘skip_before_action` untouched — `only:` / `except:` scope the skip to specific query methods (each method is one controller action), `raise: false` tolerates a callback the parent does not define.

Parameters:

  • callbacks (Array<Symbol>)

    callback name(s) to skip.

  • options (Hash)

    forwarded to ‘skip_before_action` verbatim.



91
92
93
94
# File 'lib/ruact/query.rb', line 91

def ruact_skip_before_action(*callbacks, **options)
  __ruact_skipped_callbacks << [callbacks.map(&:to_sym), options]
  nil
end

Instance Method Details

#current_userObject?

Returns the host’s authenticated user, via the dispatching controller’s own ‘current_user` (Devise / Pundit / hand-rolled).

Returns:

  • (Object, nil)

    the host’s authenticated user, via the dispatching controller’s own ‘current_user` (Devise / Pundit / hand-rolled).



51
52
53
# File 'lib/ruact/query.rb', line 51

def current_user
  @__ruact_context.current_user
end

#paramsObject

Returns the request params (query-string parameters on a GET).

Returns:

  • (Object)

    the request params (query-string parameters on a GET).



56
57
58
# File 'lib/ruact/query.rb', line 56

def params
  @__ruact_context.params
end

#requestObject

Returns the live request.

Returns:

  • (Object)

    the live request.



61
62
63
# File 'lib/ruact/query.rb', line 61

def request
  @__ruact_context.request
end

#sessionObject

Returns the host middleware’s session.

Returns:

  • (Object)

    the host middleware’s session.



66
67
68
# File 'lib/ruact/query.rb', line 66

def session
  @__ruact_context.session
end