Module: LcpRuby::Metadata::MenuItemResolver

Defined in:
lib/lcp_ruby/metadata/menu_item_resolver.rb

Overview

Resolves a ‘presenter:`-typed MenuItem to a `{ url:, method: }` pair at render time. Mirrors the engine’s controller-routing contract:

- `action: :show / :edit / :destroy` requires `alias:` (or an
  explicit ID via `defaults: { id: ... }`); URL embeds the alias
  name.
- `action: :new` / `:index` — no alias required.
- Custom action with `alias:` — single-record action via
  `single_action_path(... action_name:)`.
- Custom action without `alias:` — collection-context action via
  `collection_action_path(... action_name:)`.

Default HTTP method follows the action’s CRUD convention; an explicit ‘method:` on the YAML item overrides.

Constant Summary collapse

DEFAULT_METHODS =
{
  "show" => :get,
  "edit" => :get,
  "new" => :get,
  "index" => :get,
  "destroy" => :delete
}.freeze

Class Method Summary collapse

Class Method Details

.resolve_presenter(item, loader:) ⇒ Object

Resolves a ‘presenter:` item to a final URL + method pair. Returns `nil` when the presenter is not registered (defense in depth — the validator should have surfaced this at boot, but rendering must not crash if state somehow drifts).



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/lcp_ruby/metadata/menu_item_resolver.rb', line 32

def resolve_presenter(item, loader:)
  return nil unless item.presenter_slug.present?

  presenter_def = loader.presenter_definitions[item.presenter_slug.to_s]
  return nil unless presenter_def

  action = item.action_name.to_s
  builtin = MenuItem::BUILTIN_ACTIONS.include?(action)
  method = item.http_method || (builtin ? DEFAULT_METHODS[action] : :post)

  query = sanitize_defaults(item.defaults)
  url_helpers = LcpRuby::Engine.routes.url_helpers
  slug = presenter_def.slug || presenter_def.name

  url =
    if builtin
      builtin_url(url_helpers, slug, action, item.alias_name, query)
    else
      custom_url(url_helpers, slug, action, item.alias_name, query)
    end

  { url: url, method: method }
end