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
-
.resolve_presenter(item, loader:) ⇒ Object
Resolves a ‘presenter:` item to a final URL + method pair.
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 |