扩展ActiveRecord method_missing

时间:2012-12-05 02:45:20

标签: ruby-on-rails activerecord extending

我一直在寻找网络并且已经找到了大量关于尝试我的信息,但是我想添加到我的Ruby / Rails mixin中的一点糖,正在创建一个寻找的功能一种模式。我想创建一个名为

的基函数

is_a _ *

其中*可以是任何东西。无论是什么*都需要可以检索,所以我可以在函数内部使用它并相应地采取行动。我必须使用method_missing吗?

1 个答案:

答案 0 :(得分:4)

这是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