Вы можете сделать что-то вроде этого:
r = api_method.split('.').inject(@es_conn.client) { |obj, m| obj.public_send(m) }
, если вы хотите поддерживать цепочки произвольных методов. Это позволит использовать любые точки в @method_prefix
и method
. Если вы тоже хотите разрешить закрытые методы, то:
r = api_method.split('.').inject(@es_conn.client) { |obj, m| obj.send(m) }
Это предполагает, что вы управляете всем и не допускаете какого-либо внешнего ввода в @method_prefix
или method
; если вы разрешаете ввод данных извне, то вам действительно нужно занести все в белый список, чтобы избежать вызова неожиданных и опасных методов.
Редактировать: если вам нужно передать параметры в последний вызов, вам нужно сделать что-то вроде этого:
api_method = "#{@method_prefix}#{method}".split('.')
last = api_method[-1]
r = api_method.inject(@es_conn.client) do |obj, m|
m == last ? obj.public_send(m, params) : obj.public_send(m)
end
, чтобы добавить параметр в последний вызов. Вероятно, есть более элегантный способ сделать это;)