#9 楼 @jjym block 的用法是为了 Sinatra 的 DSL 特性,这个很多软件都这么写。
但是 sinatra 内部又把这个 block 实际上转换成一个 unbound_method, 然后每次请求 绑定在 当前的 app 上面。
所以我说是为了利用上下文。不是性能。而支持 DSL 语法是 block 做的,与 unbound_method 关系不大。
# https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L869
# Rack call interface.
def call(env)
dup.call!(env)
end
# https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L974
def process_route(pattern, keys, conditions, block = nil, values = [])
route = @request.path_info
route = '/' if route.empty? and not settings.empty_path_info?
return unless match = pattern.match(route)
values += match.captures.to_a.map { |v| force_encoding URI.unescape(v) if v }
if values.any?
original, @params = params, params.merge('splat' => [], 'captures' => values) keys.zip(values) { |k,v| Array === @params[k] ? @params[k] << v : @params[k] = v if v }
end
catch(:pass) do
conditions.each { |c| throw :pass if c.bind(self).call == false }
block ? block[self, values] : yield(self, values)
end
ensure
@params = original if original
end
如果不用这个方式,这里该怎么处理?
#9 楼 @kenshin54 文档写的都是普通需求,高级需求要看源码甚至要 hack 了。 一般文档不会把所有的功能都写出来,因为有些隐形功能仅仅是程序员写的时候为了易扩展,根本就没打算给别人用。
这个方法就挺好,其他的估计没这么好。
楼主怎么也想不到帖子会变成这样,^_^
#6 楼 @kenshin54 insert_before 方法可以传入一个 index,不一定就是 middleware 名字,比如 Mytest::Application.config.middleware.insert_before 0, MyMiddleware。
直接改 config.middleware 的数组行么?我看到 这里 有一个 insert 方法,有一个 index 参数。不知道这个行不行,没试过,不负责任猜测。
#21 楼 @blacktulip 最讨厌说呵呵的人了。呵呵。
学会一个工具本来就没什么了不起的。
self 不同。
别的不说了,代码风格很成问题。
#3 楼 @xmonkeycn 我本来也以为是个分享到新浪微博
之类的东西。
@linlis 要是整本书都放上去,是不是要花些时间搞 markdown 的排版呢?
#1 楼 @xmonkeycn 可以啊,左边有个工具。
我觉得非常赞!
建议 lz 搞清楚 rails reload 的原理,然后慢慢排错,这么猜和尝试意义不大。比如 @iBachue 提到的 ActiveSupport::FileUpdateChecker。
我也希望能知道你的问题所在。
真难过,我最熟悉的 DB 啊。
不带地址的行为也要谴责。