Gibt es eine Möglichkeit, ein Argument zu einem Controller-Aktion Anruf von Middleware übergeben? Aufruf einer Controller-Aktion mit Argument aus Rack-Middleware
Dies ist die Aktion in Controller-Code
# in my_controller.rb
#
def print_name(name)
render :text => "Hello, #{name}!"
end
Hier ist der Code von meiner Middleware, die diese Aktion ruft
# in middleware
#
def call(env)
env['action_controller.instance'].class.action(:print_name).call(env)
end
Dies natürlich ArgumentError
wirft.
Ich bin mir nicht bewusst, wie ich ein Argument an action
Anruf übergeben kann. Hier ist die Quelle:
# in action_pack/lib/action_controller/metal.rb
#
def self.action(name, klass = ActionDispatch::Request)
middleware_stack.build(name.to_s) do |env|
new.dispatch(name, klass.new(env))
end
end
Wie Sie sehen können, gibt es einen Rack-Endpunkt von der bereitgestellten Controller-Aktion zurück. Ich sehe keine Möglichkeit, hier einen Streit zu führen.
Ich landete den Controller dynamisch mit class_eval
ändern und dann die Controller-Methode von dieser Proxy-Methode aufrufen.
# in middleware
#
def define_proxy_method(klass)
klass.class_eval do
def call_the_real_method
print_name(request.env['fake_attribute'])
end
end
end
def call(env)
define_proxy_method(env['action_controller.instance'].class)
env['fake_attrbute'] = "Yukihiro"
env['action_controller.instance'].class.action(:call_the_real_method).call(env)
end
Dies scheint schmutzig, und ich möchte einen besseren Weg kennen. Vielen Dank.
Es muss doch ein besserer Ansatz sein, was auch immer du bist versuchen zu tun. Wenn Sie mehr Kontext für das bereitstellen könnten, was Sie letztendlich erreichen möchten, gibt es wahrscheinlich eine viel weniger hacky Lösung. –
Ich versuche, zu einer bestimmten Controller-Aktion umzuleiten, nachdem die Ausnahme ausgelöst wurde. Im Grunde ist es ein [Fix] (https://github.com/airbrake/airbrake/commit/e13041bf9c69527b9bb34043617e52b6c7615657) für den Airbrake-Edelstein. Es war schwierig genug, das Beispiel des Aufrufs der Controller-Methode aus der Middleware zu finden. Danke für den Kommentar. – shime