class MenuBlock::MenuItem

Attributes

default[R]
default?[R]
match_params[R]
name[R]
route_block[R]

Public Class Methods

new(context, name, default: false, match_params: {}, &route_block) click to toggle source
# File lib/components/menu_block.rb, line 67
def initialize(context, name, default: false, match_params: {}, &route_block)
  @context = context
  @name = name
  @route_block = route_block
  @default = default
  @match_params = match_params
end

Public Instance Methods

active?() click to toggle source
# File lib/components/menu_block.rb, line 79
def active?
  matches = []

  # Set default match_params. For example: This is the default matcher for :controller if :controller isn't specified
  match_params[:controller] ||= recognized_route[:controller]

  # Make sure everything in match_params is contained in params.
  match_params.each do |key,val|
    # This will handle arrays, strings, numbers, etc. params should always return a string or nil.
    matches << Array(val).compact.map(&:to_s).include?(params[key])
  end

  # Loop through query parameters to make sure they match
  ::Rack::Utils.parse_query(URI.parse(route).query).each do |param, val|
    matches << (params[param] == val)
  end

  matches.all?
end
route() click to toggle source
# File lib/components/menu_block.rb, line 75
def route
  @route ||= route_block.call
end

Private Instance Methods

params() click to toggle source
# File lib/components/menu_block.rb, line 105
def params
  @context.params
end
recognized_route() click to toggle source
# File lib/components/menu_block.rb, line 109
def recognized_route
  @recognized_route ||= (
    recognizable_path = without_script_name { route_block.call }
    Rails.application.routes.recognize_path(recognizable_path)
  )
end
request() click to toggle source
# File lib/components/menu_block.rb, line 101
def request
  @context.request
end
without_script_name(&block) click to toggle source

The router won't recognize routes with a script_name So we need to temporarily set the script_name to nil so we can generate a path the router will like.

# File lib/components/menu_block.rb, line 119
def without_script_name(&block)
  script_name = request.script_name
  request.script_name = nil

  val = block.call

  request.script_name = script_name

  val
end