class InferredCrumpets::Builder

Attributes

parents[R]
subject[R]
view_context[R]

Public Class Methods

build_all!(view_context, subject, parents = []) click to toggle source
# File lib/inferred_crumpets/builder.rb, line 12
def self.build_all!(view_context, subject, parents = [])
  new(view_context, subject, parents).build_all!
end
build_inferred_crumbs!(view_context) click to toggle source
# File lib/inferred_crumpets/builder.rb, line 5
def self.build_inferred_crumbs!(view_context)
  subject = SubjectFinder.for_context(view_context)
  return unless subject
  parents = [view_context.parent_object].compact.flatten rescue []
  build_all!(view_context, subject, parents)
end
build_single!(view_context, subject) click to toggle source
# File lib/inferred_crumpets/builder.rb, line 16
def self.build_single!(view_context, subject)
  new(view_context, subject).build_single!
end
new(view_context, subject, parents = []) click to toggle source
# File lib/inferred_crumpets/builder.rb, line 20
def initialize(view_context, subject, parents = [])
  @route_checker  = RouteChecker.new(view_context)
  @view_context   = view_context
  @subject        = subject
  @parents        = parents
end

Public Instance Methods

build_all!() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 27
def build_all!
  build_crumbs_for_parents!
  build_crumb_for_collection!
  build_crumb_for_action!
end
build_single!() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 33
def build_single!
  build_crumb_for_subject!
end

Private Instance Methods

action() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 108
def action
  view_context.params[:action]
end
add_crumb(label) click to toggle source
# File lib/inferred_crumpets/builder.rb, line 64
def add_crumb(label)
  view_context.crumbs.add_crumb(label, wrapper_options: { class: 'active' })
end
build_crumb_for_action!() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 57
def build_crumb_for_action!
  return unless subject.is_a?(ActiveRecord::Base)
  crumb = ActionProcessor.for_action(action)
  build_crumb_for_subject! if crumb.has_subject?
  add_crumb(crumb.label) if crumb.label.present?
end
build_crumb_for_collection!() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 45
def build_crumb_for_collection!
  return if parents.present? && linkable?

  if subject.class.respond_to?(:collection_title)
    view_context.crumbs.add_crumb subject.class.collection_title, url_for_collection
  elsif subject.is_a?(ActiveRecord::Relation)
    view_context.crumbs.add_crumb relation_name.pluralize.titleize
  elsif subject.is_a?(ActiveRecord::Base)
    view_context.crumbs.add_crumb subject.class.table_name.titleize, url_for_collection
  end
end
build_crumb_for_subject!() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 68
def build_crumb_for_subject!
  view_context.crumbs.add_crumb(subject_name, url_for_subject)
end
build_crumbs_for_parents!() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 39
def build_crumbs_for_parents!
  parents.each do |parent|
    Builder.build_single!(view_context, parent)
  end
end
can_route?(action, params = {}) click to toggle source
# File lib/inferred_crumpets/builder.rb, line 104
def can_route?(action, params = {})
  @route_checker.can_route?(subject, action, params)
end
class_with_parents() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 120
def class_with_parents
  [parents.last, transformed_subject.class].compact
end
linkable?() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 92
def linkable?
  @route_checker.linkable?(transformed_subject)
end
parents_and_class_linkable?() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 100
def parents_and_class_linkable?
  @route_checker.linkable?((parents + [transformed_subject.class]).compact)
end
parents_and_subject_linkable?() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 96
def parents_and_subject_linkable?
  @route_checker.linkable?((parents + [subject.class]).compact)
end
relation_name() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 112
def relation_name
  subject.respond_to?(:name) && subject.name.present? ? subject.name : subject.to_s
end
subject_name() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 116
def subject_name
  subject.respond_to?(:crumb_title) && subject.crumb_title.present? ? subject.crumb_title : subject.to_s
end
subject_requires_transformation?() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 84
def subject_requires_transformation?
  subject.respond_to?(:becomes) && !parents_and_subject_linkable?
end
transformed_subject() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 88
def transformed_subject
  subject_requires_transformation? ? subject.becomes(subject.class.base_class) : subject
end
url_for_collection() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 77
def url_for_collection
  return view_context.objects_path if view_context.objects_path.present?
  return unless can_route?(:index)
  return view_context.url_for(transformed_subject.class) if linkable?
  return view_context.url_for(class_with_parents) if parents_and_class_linkable?
end
url_for_subject() click to toggle source
# File lib/inferred_crumpets/builder.rb, line 72
def url_for_subject
  return unless can_route?(:show, id: subject.id) && linkable?
  view_context.url_for(transformed_subject)
end