想知道 Rails 动态生成的函数的源码是什么。 比如在路由中定义以下代码:
resources :posts
Rails 会动态生成一些函数,
比如posts_path
这个函数。
我发现 Method Class 提供了一下些方法,但是就是没有函数的源码。
后来我发现了一个 gem 叫做 ParseTree
可以实现以下效果:
class PostsController
def new
method = PostsController.instance_method(:posts_path)
puts method.to_ruby
end
end
log 输出如下:
proc { |*args|
options = hash_for_posts_path(args.extract_options!)
if args.any? then
options[:_positional_args] = args
options[:_positional_keys] = [:format]
end
url_for(options)
}
目前 ParseTree 不支持 Ruby 1.9。 有没有同学,研究过这类问题,请给点建议。 有没有比 ParseTree 更好的解决方案?
通过查看动态生成的函数的源码,更好的理解函数的使用。
Rails 中有很多函数都是动态生成的, 如果我没记错的话,@ashchan在一次关于元编程的演讲中说, rails 内部对元编程的使用达到了奇淫技巧,令人发指的程度。
动态生成函数,有很多好处,不用我多说, 但同时也给我们带来了很多麻烦,
起初,我们使用 url_path 等 rails 动态生成的函数的时候, 感觉很快乐,都是动态生成的,觉得 rails 很酷, 但后来,可能因为某次调用失败,于是你开始想知道, 这个函数到底该如何使用,这个函数的源码是什么,他到底做了什么的时候,你就会很痛苦。 因为,我们无法简单地,快速地,直接地,查看这些动态生成的函数的源码,
第一 代码阅读工具失效 我们无法通过 ctags 之类的工具,阅读动态生成的代码。
第二 源码极其难懂 即使,你通过Method#source_location方法, 找到了,动态生成的函数的定义处,想彻底的理解那些 maigc code,也是非常的痛苦。
第三 没有官方文档 动态生成的函数,通常也有没有官方文档。 没有固定的函数名,怎么写文档啊。 没有文档和源码,你无法知道你的用法是否正确,只能 run 一下试试。
无法简单直接的阅读和理解,动态生成的函数的源码,让我们感觉很不爽。