Module: ExpoTurbo::Rails::DomIds

Defined in:
lib/expo_turbo/rails/dom_ids.rb,
lib/expo_turbo/rails/dom_ids/helper.rb

Defined Under Namespace

Modules: Helper

Constant Summary collapse

ROLE_PREFIXES =
{
  record: nil,
  document: :document,
  frame: :frame,
  list: :list,
  form: :form,
  error: :error,
  loading: :loading
}.freeze

Class Method Summary collapse

Class Method Details

.id_for(record_or_class, role = :record) ⇒ Object

Raises:

  • (ArgumentError)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/expo_turbo/rails/dom_ids.rb', line 20

def id_for(record_or_class, role = :record)
  prefix = ROLE_PREFIXES.fetch(role) do
    raise ArgumentError, "unsupported Expo Turbo target role: #{role.inspect}"
  end

  if record_or_class.is_a?(Class)
    raise ArgumentError, "only list targets may be derived from a model class" unless role == :list
    raise ArgumentError, "Expo Turbo list targets require a model class" unless record_or_class.respond_to?(:model_name)

    return validate!(ActionView::RecordIdentifier.dom_id(record_or_class, prefix))
  end

  model = record_or_class.respond_to?(:to_model) ? record_or_class.to_model : record_or_class
  unless model&.respond_to?(:to_key) && model.respond_to?(:persisted?) && model.persisted?
    raise ArgumentError, "Expo Turbo #{role} targets require a persisted model"
  end
  raise ArgumentError, "Expo Turbo #{role} targets require a persisted model" unless complete_key?(model.to_key)
  raise ArgumentError, "Expo Turbo #{role} targets require a model name" unless model.respond_to?(:model_name)

  validate!(ActionView::RecordIdentifier.dom_id(model, prefix))
end