class Hanami::Slice::ViewNameInferrer

Infers a view name for automatically rendering within actions.

@api private @since 2.0.0

Constants

ALTERNATIVE_NAMES

Public Class Methods

call(action_class_name:, slice:) click to toggle source

Returns an array of container keys for views matching the given action.

Also provides alternative view keys for common RESTful actions.

@example

ViewNameInferrer.call(action_name: "Main::Actions::Posts::Create", slice: Main::Slice)
# => ["views.posts.create", "views.posts.new"]

@param action_class_name [String] action class name @param slice [Hanami::Slice, Hanami::Application] Hanami slice containing the action

@return [Array<string>] array of paired view container keys

# File lib/hanami/slice/view_name_inferrer.rb, line 30
def call(action_class_name:, slice:)
  action_key_base = slice.config.actions.name_inference_base
  view_key_base = slice.config.actions.view_name_inference_base

  action_name_key = action_name_key(action_class_name, slice, action_key_base)

  view_key = [view_key_base, action_name_key].compact.join(CONTAINER_KEY_DELIMITER)

  [view_key, alternative_view_key(view_key)].compact
end

Private Class Methods

action_name_key(action_name, slice, key_base) click to toggle source
# File lib/hanami/slice/view_name_inferrer.rb, line 43
def action_name_key(action_name, slice, key_base)
  slice
    .inflector
    .underscore(action_name)
    .sub(%r{^#{slice.slice_name.path}#{PATH_DELIMITER}}, "")
    .sub(%r{^#{key_base}#{PATH_DELIMITER}}, "")
    .gsub("/", CONTAINER_KEY_DELIMITER)
end
alternative_view_key(view_key) click to toggle source
# File lib/hanami/slice/view_name_inferrer.rb, line 52
def alternative_view_key(view_key)
  parts = view_key.split(CONTAINER_KEY_DELIMITER)

  alternative_name = ALTERNATIVE_NAMES[parts.last]
  return unless alternative_name

  [parts[0..-2], alternative_name].join(CONTAINER_KEY_DELIMITER)
end