Если вы готовы пойти на такой подход, вам, вероятно, следует отсканировать поданную строку поиска и затем include
правильную.
В той же ситуации я попробовал другой подход. Я расширяю модуль новыми методами, @@ регистрирую их, чтобы не регистрировать два метода с одинаковыми именами. Пока что это работает хорошо, хотя проект, который я начал, далеко не оставляет конкретную область одного запутанного беспорядка определенного веб-сайта.
Это основной файл.
module Onigiri
extend self
@@registry ||= {}
class OnigiriHandlerTaken < StandardError
def description
"There was an attempt to override registered handler. This usually indicates a bug in Onigiri."
end
end
def clean(data, *params)
dupe = Onigiri::Document.parse data
params.flatten.each do |method|
dupe = dupe.send(method) if @@registry[method]
end
dupe.to_html
end
class Document < Nokogiri::HTML::DocumentFragment
end
private
def register_handler(name)
unless @@registry[name]
@@registry[name] = true
else
raise OnigiriHandlerTaken
end
end
end
А вот файл расширения.
# encoding: utf-8
module Onigiri
register_handler :fix_backslash
class Document
def fix_backslash
dupe = dup
attrset = ['src', 'longdesc', 'href', 'action']
dupe.css("[#{attrset.join('], [')}]").each do |target|
attrset.each do |attr|
target[attr] = target[attr].gsub("\\", "/") if target[attr]
end
end
dupe
end
end
end
Другой способ, который я вижу, состоит в том, чтобы использовать набор различных (но неразличимых по поведению) классов с простым механизмом принятия решения для вызова правильного. Простого хеша, который содержит имена классов и соответствующий url_matcher, вероятно, будет достаточно.
Надеюсь, это поможет.