Расширить метод ActiveRecord_missing

Я искал в Интернете и нашел много информации о попытках того, чем я являюсь, однако один кусочек сахара, который я хотел бы добавить к моему миксину Ruby/Rails, — это создание функции, которая ищет шаблон. Я хочу создать базовую функцию с именем

is_a_*

где * может быть что угодно. Что бы это ни было, оно должно быть извлекаемым, чтобы я мог использовать его внутри функции и действовать соответствующим образом. Должен ли я использовать method_missing?


person Volte    schedule 05.12.2012    source источник
comment
Можете ли вы объяснить, как метод is_a_* будет получать, является ли объект * (что угодно) или нет?   -  person Nicolas Garnil    schedule 05.12.2012


Ответы (1)


Это то, для чего был создан method_missing, например. что-то вроде этого должно работать:

module MyMixin

  def respond_to?(method, priv=false)
    (method.to_s =~ /^is_a_(\w+)$/) || super
  end

  def method_missing(sym, *args)
    if sym.to_s =~ /^is_a_(\w+)$/
      pattern = $1
      # then just do something with pattern here, e.g.:
      puts pattern
    else
      super
    end
  end

end

Затем просто включите MyMixin в свой класс, например:

class A
  include MyMixin
end

a = A.new
a.is_a_foo
#=> "foo"

p.s. вам не обязательно переопределять respond_to?, я просто включил его для полноты картины:

a.respond_to?("is_a_foo")
#=> true
a.respond_to?("is_a_bar")
#=> true
a.respond_to?("is__a_foo")
#=> false
person Chris Salzberg    schedule 05.12.2012