module SimpleNavigation module Adapters class Rails < Base attr_reader :controller, :template def self.register SimpleNavigation.set_env(::Rails.root, ::Rails.env) # Autoloading in initializers is deprecated on rails 6.0 # This delays the hook initialization using the on_load # hooks, but does not change behaviour for existing # rails versions. if ::Rails::VERSION::MAJOR >= 6 ActiveSupport.on_load(:action_controller_base) do SimpleNavigation::Adapters::Rails.register_controller_helpers end else register_controller_helpers end end def self.register_controller_helpers ActionController::Base.send(:include, SimpleNavigation::Helpers) SimpleNavigation::Helpers.instance_methods.each do |m| ActionController::Base.send(:helper_method, m.to_sym) end end def initialize(context) @controller = extract_controller_from context @template = template_from @controller @request = @template.request if @template end def request_uri return '' unless request if request.respond_to?(:fullpath) request.fullpath else request.request_uri end end def request_path request ? request.path : '' end def context_for_eval template || controller || fail('no context set for evaluation the config file') end def current_page?(url) template && template.current_page?(url) end def link_to(name, url, options = {}) template && template.link_to(link_title(name), url, options) end def content_tag(type, content, options = {}) template && template.content_tag(type, html_safe(content), options) end protected def template_from(controller) if controller.respond_to?(:view_context) controller.view_context else controller.instance_variable_get(:@template) end end # Marks the specified input as html_safe (for Rails3). # Does nothing if html_safe is not defined on input. # def html_safe(input) input.respond_to?(:html_safe) ? input.html_safe : input end # Extracts a controller from the context. def extract_controller_from(context) if context.respond_to?(:controller) context.controller || context else context end end def link_title(name) if SimpleNavigation.config.consider_item_names_as_safe html_safe(name) else name end end end end end