Zum Beispiel Aufruf Ich habe Klasse mit zwei Methoden:Dynamische Methode mit Argumenten
class Example < ActiveRecord::Base
def method_one(value)
end
def method_two
end
end
und Verfahren in der Steuerung, wo ich sie nenne:
def example
ex = Example.find(params[:id])
ex.send(params[:method], params[:value]) if ex.respond_to?(params[:method])
end
Aber das Problem kommt, wenn ich versuche method_two
anrufen
ArgumentError (wrong number of arguments (1 for 0))
Es geschieht, weil params[:value]
kehrt nil
. Die einfachste Lösung ist:
def example
ex = Example.find(params[:id])
if ex.respond_to?(params[:method])
if params[:value].present?
ex.send(params[:method], params[:value])
else
ex.send(params[:method])
end
end
end
Ich frage mich, ob es eine bessere Problemumgehung nicht Argument übergeben, wenn es null ist.
Ich dachte da über Sicherheit nach, aber ich kannte den Fall mit 'eval' nicht. Methoden wie 'update',' destroy' usw. zu übergehen, war für mich keine große Sache, weil es eines der Dinge war, die ich dem Benutzer erlauben wollte. Ich habe eine Frage. Warum frierst du Hash nicht mit allowed_methods ein? – Gregy
Ich empfehle, etwas ähnliches zu verwenden, was ich zuerst in meiner Antwort schrieb, es wird sicherer sein und behandelt pro Methode die Anzahl der Parameter. – Geoffroy
'allowed_methods' ist definitiv eine gute Idee, aber die Implementierung ist ein perfektes Beispiel für Over-Over-Design. '% i | method_one method_zwei |' ist genug. Der Trick, die gleiche Anzahl von Parametern zu verwenden, ist eine sehr schlechte Idee: Sie bricht das SRP-Prinzip und macht diesen Code im Grunde nicht tragbar. – mudasobwa