2

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 ^^ "

Antwort

0

Ich sah einige upvotes, also hier ist meine aktuelle Lösung:

Mit dem Beispiel eines sehr leichten Zugriffskontrollverfahren, war der ursprüngliche Name von my_callbackaccess_control

# controllers/concerns/access_control.rb 
    module AccessControl 
     extend ActiveSupport::Concern 
     class_methods do 
     define_method :my_callback do |*names, &blk| 
      _insert_callbacks(names, blk) do |name, options| 
      set_callback(:my_callback, :before, name, options) 
      end 
     end 
     end 

     included do 

     define_callbacks :my_callback 

     def perform_if_access_granted 
      run_callbacks :my_callback do 
      if @access_denied and not @access_authorized and not god_mode? 
       @request_authentication = true unless user_signed_in? 
       render(
       file: File.join(Rails.root, 'app/views/errors/403.html'), 
       status: 403, 
       layout: 'error') 
      else 
       yield 
      end 
      end 
     end 

Dann in Ihren anderen Controllern, die das Modul (wieder mit Zutrittskontrolle Beispiel)

# controllers/your_controller.rb 
class YourController < SeekerController 
    your_callback do 
    set_entity 
    allow_access_to_entity(@entity) 
    end 
umfassen
Verwandte Themen