Для примера у меня есть класс с двумя методами:Динамический метод вызова с аргументами
class Example < ActiveRecord::Base
def method_one(value)
end
def method_two
end
end
и метод в контроллере, где я называю их:
def example
ex = Example.find(params[:id])
ex.send(params[:method], params[:value]) if ex.respond_to?(params[:method])
end
Но проблема возникает, когда я пытаюсь вызвать method_two
ArgumentError (wrong number of arguments (1 for 0))
Это происходит потому, что params[:value]
возвращается nil
. Самое простое решение:
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
Интересно, есть ли какие-либо лучше обойти, чтобы не передать аргумент, если это нуль.
Я думал о безопасности, но я не знал случая с 'eval'. Передача таких методов, как 'update',' destroy' и т. Д., Для меня не была большой проблемой, потому что это была одна из вещей, которые я хотел разрешить пользователю. У меня есть один вопрос. Почему бы вам не замораживать хэш с allow_methods? – Gregy
Я рекомендую использовать что-то похожее на то, что я впервые написал в своем ответе, он будет более безопасным и обрабатывает по каждому методу количество параметров. – Geoffroy
'allowed_methods' определенно хорошая идея, но реализация является прекрасным примером чрезмерного дизайна. '% i | method_one method_two |' достаточно. Трюк с использованием переноса с одинаковым количеством параметров - очень плохая идея: он нарушает принцип SRP и в основном делает этот код неприемлемым. – mudasobwa