From 10d11e8127bc7f33435befecd5911a58208132b6 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kryukov Date: Mon, 21 Oct 2024 21:49:12 +0300 Subject: [PATCH] Copy ActionFilter to support Rails < 7.1 --- lib/inertia_rails/action_filter.rb | 27 +++++++++++++++++++++++++++ lib/inertia_rails/controller.rb | 5 +++-- 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 lib/inertia_rails/action_filter.rb diff --git a/lib/inertia_rails/action_filter.rb b/lib/inertia_rails/action_filter.rb new file mode 100644 index 0000000..c53969d --- /dev/null +++ b/lib/inertia_rails/action_filter.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +# +# Based on AbstractController::Callbacks::ActionFilter +# https://github.com/rails/rails/blob/v7.2.0/actionpack/lib/abstract_controller/callbacks.rb#L39 +module InertiaRails + class ActionFilter + def initialize(conditional_key, actions) + @conditional_key = conditional_key + @actions = Array(actions).map(&:to_s).to_set + end + + def match?(controller) + missing_action = @actions.find { |action| !controller.available_action?(action) } + if missing_action + message = <<~MSG + The #{missing_action} action could not be found for the :inertia_share + callback on #{controller.class.name}, but it is listed in the controller's + #{@conditional_key.inspect} option. + MSG + + raise ActionNotFound.new(message, controller, missing_action) + end + + @actions.include?(controller.action_name) + end + end +end diff --git a/lib/inertia_rails/controller.rb b/lib/inertia_rails/controller.rb index c10aa01..27997ab 100644 --- a/lib/inertia_rails/controller.rb +++ b/lib/inertia_rails/controller.rb @@ -1,5 +1,6 @@ require_relative "inertia_rails" require_relative "helper" +require_relative "action_filter" module InertiaRails module Controller @@ -94,7 +95,7 @@ def extract_inertia_share_options(props) def extract_inertia_share_option(options, from, to) if (from_value = options.delete(from)) - filter = AbstractController::Callbacks::ActionFilter.new([:inertia_share], from, from_value) + filter = InertiaRails::ActionFilter.new(from, from_value) options[to] = Array(options[to]).unshift(filter) end end @@ -105,7 +106,7 @@ def filter_to_proc(filter) -> { send(filter) } when Proc filter - when AbstractController::Callbacks::ActionFilter + when InertiaRails::ActionFilter -> { filter.match?(self) } else raise ArgumentError, "You must pass a symbol or a proc as a filter."