Ich brauche eine genauere Steuerung in der Reihenfolge der Rückrufe in meinen Controllern. Derzeit können Sie Rails nur append|prepend_before|after_action
verwenden, aber das ist nur extrem schlecht, wenn Sie ein Modul mit seinen dedizierten Rückrufe hinzufügen möchten.Registrieren Sie eine andere Art von Rückruf in ApplicationController
Ich versuche zu verstehen, wie AbstractController :: Callbacks arbeiten, und ich versuche, eine neue Art von Rückruf zu registrieren, die zu einem bestimmten Zeitpunkt ausgeführt werden würde, unter Ausnutzung der Rail-Controller-Syntax für das Hinzufügen eines Rückrufs (nur/außer + Liste der Aktionen usw.).
Sie können es sich als eine benutzerdefinierte Access Control-Funktion vorstellen, aber diese Frage betrifft nicht die Zugriffskontrolle, bitte achten Sie darauf, mit Edelsteinen wie Cancan answerbombing.
class ApplicationController
include xxx
include MyModuleWithCallbacks
include yyy
...
end
class MyController < ApplicationController
prepend_before_action :something_before_my_callbacks
my_callback_list :custom_callback, only: [:index, :show]
before_action :something_after_my_callbacks
# Goal : the order of above callbacks should NOT matter, my_callback does not depend on ActionController process_action callback list
end
module MyModuleWithCallbacks
extend ActiveSupport::Concern
extend AbstractController::Callbacks
included do
around_action :perform_if_condition
def perform_if_condition
run_callbacks :my_callback_list do
if my_callbacks_went_good?
yield # And run the controller's before_callbacks
else
# log, render error page, etc.
end
end
end
# This is the hard part register the callback, I tried
class_methods do
define_method :my_callback_list do |*names, &blk|
_insert_callbacks(names, blk) do |name, options|
set_callback(:my_callback_list, :before, name, options)
end
end
end
Der aktuelle Fehler ist
nicht definierte Methode `_my_callbacks_list_callbacks' für PublicController: Klasse
ich meine Inspiration aus dem Quellcode von AbstractController::Callbacks nehme, aber ich bin mir nicht sicher, verstehe, was dort vor sich geht ^^ "