2007-08-14
module中的函数重定义之后,如何re-mixins?
需要在页面上输出每次require的调用时间。于是修改了 rails中的一个 方法,方法是module的一部分 。但是 如何remixins,却是大问题了。
或者另外一个方法直接修改 mixins以后的代码。 但是嵌套了多个module之后, 不清楚怎么去修改这个方法了。
以下是代码
或者另外一个方法直接修改 mixins以后的代码。 但是嵌套了多个module之后, 不清楚怎么去修改这个方法了。
以下是代码
module ActionController #:nodoc:
module Benchmarking #:nodoc:
module ClassMethods
def perform_action_with_benchmark
unless logger
perform_action_without_benchmark
else
runtime = [Benchmark::measure{ perform_action_without_benchmark }.real, 0.0001].max
@runtime_require = runtime #这句是添加的代码
log_message = "Completed inaa #{sprintf("%.5f", runtime)} (#{(1 / runtime).floor} reqs/sec)"
log_message << rendering_runtime(runtime) if defined?(@rendering_runtime)
log_message << active_record_runtime(runtime) if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
log_message << " | #{headers["Status"]}"
log_message << " [#{complete_request_uri rescue "unknown"}]"
logger.info(log_message)
end
end
end
end
end
- 15:43
- 浏览 (3716)
- 论坛浏览 (2094)
- 评论 (7)
- 相关推荐
评论
今天刚好也有这个需求,我是这样实现的:
在development模式下即改即生效
oops,忘了高亮代码,亮了
# file: /app/application.rb
class ApplicationController < ActionController::Base
include AppendBenchmarking
end
# file: /lib/append_benchmarking.rb
module AppendBenchmarking #:nodoc:
def self.included(klass)
# 在Rails似乎不能直接覆盖掉alias_method得到的方法(指perform_action_with_benchmark),所以还是要再用alias一次
klass.class_eval do
alias_method_chain :perform_action, :append_benchmark
end
end
def perform_action_with_append_benchmark
unless logger
perform_action_without_benchmark
else
runtime = [Benchmark::measure{ perform_action_without_benchmark }.real, 0.0001].max
log_message = "Completed in #{sprintf("%.5f", runtime)} (#{(1 / runtime).floor} reqs/sec)"
log_message << rendering_runtime(runtime) if defined?(@rendering_runtime)
log_message << active_record_runtime(runtime) if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
log_message << " | #{headers["Status"]}"
log_message << " [#{complete_request_uri rescue "unknown"}]"
log_message << " append some benchmark message here"
logger.info(log_message)
end
end
end
在development模式下即改即生效
oops,忘了高亮代码,亮了
我也有跟楼主一样的问题:
我想修改ActionView::Helpers::NumberHelper下的number_helper.rb文件中一个actionview方法的默认值
变成
我尝试将整个number_helper.rb修改后复制到rails_project/lib/actionpack/lib/action_view/helpers/number_helper.rb
或者rails_project/lib/action_view/helpers/number_helper.rb
都不工作,我现在能想到的办法是在rails_project/app/helpers/application_helper.rb中重写这个方法,在这里的确会将已经min-in的静态方法给override掉,但是这个办法用多了可能会让application_helper变得混乱.
我想修改ActionView::Helpers::NumberHelper下的number_helper.rb文件中一个actionview方法的默认值
ruby 代码
- number_with_precision(number, precision=3)
变成
ruby 代码
- number_with_precision(number, precision=2)
我尝试将整个number_helper.rb修改后复制到rails_project/lib/actionpack/lib/action_view/helpers/number_helper.rb
或者rails_project/lib/action_view/helpers/number_helper.rb
都不工作,我现在能想到的办法是在rails_project/app/helpers/application_helper.rb中重写这个方法,在这里的确会将已经min-in的静态方法给override掉,但是这个办法用多了可能会让application_helper变得混乱.
呵呵,还是有问题。改过的代码都没有被load, 特意多写了个end在代码中,启动的时候也没有报错。看来文件放的位置还有问题。
直接require修改过的代码
然后模仿 ActionController load时候的代码
ActionController::Base.class_eval do
include ActionController::Benchmarking
end
在application.rb中加入下面的代码
ApplicationController.class_eval do
include ActionController::Benchmarking
end
出现循环调用, stack撑破。
看来只有最后一招了
直接require修改过的代码
然后模仿 ActionController load时候的代码
ActionController::Base.class_eval do
include ActionController::Benchmarking
end
在application.rb中加入下面的代码
ApplicationController.class_eval do
include ActionController::Benchmarking
end
出现循环调用, stack撑破。
看来只有最后一招了
这个文件我看了一下,貌似只覆盖一个方法是不行的。因为他是定义moudule被include的时候,注入给action一堆单例方法的。好在这个文件不大,只有89行,你就把benchmarking.rb整个拷贝到rails_proejct/lib/action_controller/benchmarking.rb就可以了,然后改你要改的内容。
哦,要写在lib目录下面的啊, 我一直在 application.rb中尝试操作,试了很多办法都不行。
尝试 建立 以下文件
myproject\lib\action_controller\benchmarking.rb
myproject\lib\actionpack\lib\action_controller\benchmarking.rb
没有重新覆盖代码。 看rails的初始化代码,的确会加载这里的代码,不过怎么不会覆盖。 路径不对吗?
尝试 建立 以下文件
myproject\lib\action_controller\benchmarking.rb
myproject\lib\actionpack\lib\action_controller\benchmarking.rb
没有重新覆盖代码。 看rails的初始化代码,的确会加载这里的代码,不过怎么不会覆盖。 路径不对吗?
ruby是open class的编程语言,不需要re-mixin。
你在rails项目的lib目录下面创建同名文件(注意保持路径结构),然后其他部分都空着,只把你要改写的方法部分按照你改好的样式写进去就行了。
rails项目启动以后先读入系统原来定义的方法,随后读取到你在lib目录下面同名文件,就打开了该方法定义,用你定义的方法覆盖之,其余部分保持原样。
这便是open class方便之处阿,修改系统类库跟玩似的。
你在rails项目的lib目录下面创建同名文件(注意保持路径结构),然后其他部分都空着,只把你要改写的方法部分按照你改好的样式写进去就行了。
module ActionController #:nodoc:
module Benchmarking #:nodoc:
module ClassMethods
def perform_action_with_benchmark
.........
........ # code here
end
end
end
end
rails项目启动以后先读入系统原来定义的方法,随后读取到你在lib目录下面同名文件,就打开了该方法定义,用你定义的方法覆盖之,其余部分保持原样。
这便是open class方便之处阿,修改系统类库跟玩似的。
发表评论
该博客是同时发布到论坛的,无法评论在论坛已被锁定的帖子
- 浏览: 311757 次
- 来自: 温州

- 详细资料
搜索本博客
我的相册
4
共 1 张
共 1 张
最新评论
-
如何在管理不规范的公司中 ...
我假装给老板打工,老板假装给我付工资.
-- by sword721 -
如何在管理不规范的公司中 ...
LS说的没错,让你成为能影响环境的人!
-- by hyhongyong -
如何在管理不规范的公司中 ...
jack 写道 论坛上常说的管理不够规范,管理混乱。就实 ...
-- by leton2008 -
如何在管理不规范的公司中 ...
LZ 讲的情况确实存在; 在一个公司待久了,和身边的人(管理者)熟了,情况就复杂 ...
-- by hszhl -
如何在管理不规范的公司中 ...
JavaJason 写道这就是一种企业文化,只是这种文化没有找到清晰的归宿 公 ...
-- by hyhongyong






评论排行榜