我正在浏览camping
文档,我遇到了这个用于定义控制器的示例:
class Digits < R '/nuts/(\d+)'
def get(number)
"You got here by: /nuts/#{number}"
end
end
看起来这个类定义正在做的是它将一个字符串参数传递给R
超类。但是,我查看了camping
代码库,我没有看到R
被定义为类。它被定义为这样的方法:
def R(c,*g)
p,h=/\(.+?\)/,g.grep(Hash)
g-=h
raise "bad route" if !u = c.urls.find{|x|
break x if x.scan(p).size == g.size &&
/^#{x}\/?$/ =~ (x=g.inject(x){|x,a|
x.sub p,U.escape((a.to_param rescue a))}.gsub(/\\(.)/){$1})
}
h.any?? u+"?"+U.build_query(h[0]) : u
end
以及实际处理路线的方法:
def /(p); p[0] == ?/ ? @root + p : p end
我不明白它是如何工作的,因为当我尝试创建一个类并将方法定义为超类时,如下所示:
def doSomething(boo)
puts boo
end
class Someclass < doSomething 'boo'
end
我收到此错误:
(eval):60: (eval):60: superclass must be a Class (NilClass given) (TypeError)
有人能指出我在ruby文档中的哪个地方(使用方法作为超类)被覆盖了吗?我不知道该怎么称呼这个功能,所以我的谷歌搜索工作真的找不到任何东西。
答案 0 :(得分:1)
你必须从你的方法中返回一个类:
def doSomething(boo)
Class.new { define_method(:boo) { boo } }
end
class SomeClass < doSomething 'boo'
end
SomeClass.new.boo # => 'boo'
你也在寻找错误的方法。 Camping在控制器上有一个名为R
的类方法(这是定义控制器时使用的方法),在Base上有一个名为R
的实例方法(用于生成路由)。这是实际定义:https://github.com/camping/camping/blob/ae5a9fabfbd02ba2361ad8831c15d723d3740b7e/lib/camping-unabridged.rb#L551