Прежде всего, позвольте мне подчеркнуть, что это не обязательно хороший вариант использования для method_missing
, потому что, похоже, нет способа получить понятные имена методов, параметров и т. Д. Тем не менее, я постараюсь ответить на ваш вопрос как можно лучше.
Прежде всего, вам нужно адаптировать именование ваших методов к тем вещам, которые дает вам API, чтобы уменьшить количество параметров. В приведенном вами примере вы хотите изменить вызов метода на get_poster_by_t
, потому что poster
- это выход, а t
- входная переменная на основе URL-адреса и ответа, которым вы поделились.
Следуя этому logi c, вам нужно будет написать пропущенный метод следующим образом:
def method_missing(method, *args)
if method =~ /\Aget_([^_]+)_by_([^_]+)\z/
response = HTTP.get("http://www.omdbapi.com/?#{$~[2]}=#{args[0]}&apikey=123456789").to_s
parsed_response = JSON.parse(response)
parsed_response[$~[1].capitalize]
end
end
Затем вы также должны включить правила Ruby для реализации method_missing
, а именно вызова super
, если ваше правило не соответствует, а также отменяет respond_to_missing?
. Это дает вам:
def method_missing(method, *args)
if method.to_s =~ /\Aget_([^_]+)_by_([^_]+)\z/
response = HTTP.get("http://www.omdbapi.com/?#{$~[2]}=#{args[0]}&apikey=123456789").to_s
parsed_response = JSON.parse(response)
parsed_response[$~[1].capitalize]
else
super
end
end
def respond_to_missing?(method, *args)
method.to_s =~ /\Aget_([^_]+)_by_([^_]+)\z/ || super
end
См. Также https://makandracards.com/makandra/9821-when-overriding-method_missing-remember-to-override-respond_to_missing-as-well.
Лично я бы не использовал здесь method_missing
, а вместо этого go с вызовом выразительного метода - примерно так:
def get_field_by_param(field:, param:, value:)
response = HTTP.get("http://www.omdbapi.com/?#{param}=#{value}&apikey=123456789").to_s
parsed_response = JSON.parse(response)
parsed_response[field]
end
Затем вы можете делать такие вещи, как get_field_by_param(field: "Poster", param: :t, value: "Whatever")
.