Class: LcpRuby::Display::Renderers::RecordLink

Inherits:
BaseRenderer
  • Object
show all
Defined in:
lib/lcp_ruby/display/renderers/record_link.rb

Overview

Renders a clickable link to another presenter’s index page, optionally with Ransack filter parameters pre-filled from the current record.

Options:

slug          — static presenter slug (e.g., "import-rows")
model_field   — record field whose value is a model name; resolved to
                 a routable presenter slug at render time
filter        — Hash of Ransack predicate => value template.
                 Value templates starting with ":" are resolved from the
                 record (e.g., ":id" → record.id)
label         — link text (default: humanized slug)
icon          — optional icon name (rendered as <span class="lcp-icon ...">)
css_class     — optional CSS class override (default: "btn btn-sm btn-outline-secondary")

Examples:

# Static slug with filter
field :id, renderer: :record_link, options: {
  slug: "import-rows",
  filter: { "job_execution_id_eq" => ":id" },
  label: "Import Rows", icon: "list"
}

# Dynamic slug from model field
field :target_model, renderer: :record_link, options: {
  model_field: "target_model",
  filter: { "import_rows_job_execution_id_eq" => ":id" },
  label: "Imported Records", icon: "external-link"
}

Instance Method Summary collapse

Instance Method Details

Returns:

  • (Boolean)


52
53
54
# File 'lib/lcp_ruby/display/renderers/record_link.rb', line 52

def link_producing?
  true
end

#render(value, options = {}, record: nil, view_context: nil) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/lcp_ruby/display/renderers/record_link.rb', line 34

def render(value, options = {}, record: nil, view_context: nil)
  return nil unless view_context

  slug = resolve_slug(value, options, record)
  return nil unless slug

  href = build_href(slug, options, record, view_context)
  label_text = options["label"] || slug.tr("-_", " ").capitalize
  css = options["css_class"] || "btn btn-sm btn-outline-secondary"

  icon_html = if options["icon"]
    view_context.(:span, "", class: "lcp-icon lcp-icon-#{options['icon']}")
  end

  inner = [ icon_html, " ", label_text ].compact.join.html_safe
  view_context.(:a, inner, href: href, class: css)
end