`
jack
  • 浏览: 393127 次
  • 来自: 温州
社区版块
存档分类
最新评论

module中的函数重定义之后,如何re-mixins?

阅读更多
   需要在页面上输出每次require的调用时间。于是修改了 rails中的一个 方法,方法是module的一部分 。但是 如何remixins,却是大问题了。

或者另外一个方法直接修改 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




分享到:
评论
7 楼 rainchen 2007-11-21  
今天刚好也有这个需求,我是这样实现的:
# 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,忘了高亮代码,亮了
6 楼 lgn21st 2007-08-17  
我也有跟楼主一样的问题:<br/>
我想修改ActionView::Helpers::NumberHelper下的number_helper.rb文件中一个actionview方法的默认值
<div class='code_title'>ruby 代码</div>
<div class='dp-highlighter'>
<ol class='dp-rb' start='1'>
    <li class='alt'><span><span>number_with_precision(number, precision=3)  </span></span></li>
</ol>
</div>
<br/>
变成<br/>
<div class='code_title'>ruby 代码</div>
<div class='dp-highlighter'>
<ol class='dp-rb' start='1'>
    <li class='alt'><span><span>number_with_precision(number, precision=2)  <br/>
    </span></span></li>
</ol>
</div>
<br/>
我尝试将整个number_helper.rb修改后复制到rails_project/lib/actionpack/lib/action_view/helpers/number_helper.rb<br/>
或者rails_project/lib/action_view/helpers/number_helper.rb<br/>
都不工作,我现在能想到的办法是在rails_project/app/helpers/application_helper.rb中重写这个方法,在这里的确会将已经min-in的静态方法给override掉,但是这个办法用多了可能会让application_helper变得混乱.
5 楼 robbin 2007-08-15  
我试过了,把benchmarking.rb整个文件放在lib下面,改代码,可以生效,一切正常。
4 楼 jack 2007-08-15  
呵呵,还是有问题。改过的代码都没有被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撑破。

看来只有最后一招了 
3 楼 robbin 2007-08-14  
这个文件我看了一下,貌似只覆盖一个方法是不行的。因为他是定义moudule被include的时候,注入给action一堆单例方法的。好在这个文件不大,只有89行,你就把benchmarking.rb整个拷贝到rails_proejct/lib/action_controller/benchmarking.rb就可以了,然后改你要改的内容。
2 楼 jack 2007-08-14  
哦,要写在lib目录下面的啊, 我一直在 application.rb中尝试操作,试了很多办法都不行。



尝试  建立 以下文件
myproject\lib\action_controller\benchmarking.rb
myproject\lib\actionpack\lib\action_controller\benchmarking.rb


没有重新覆盖代码。  看rails的初始化代码,的确会加载这里的代码,不过怎么不会覆盖。 路径不对吗?
1 楼 robbin 2007-08-14  
ruby是open class的编程语言,不需要re-mixin。

你在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方便之处阿,修改系统类库跟玩似的。

相关推荐

    前端开源库-postcss-js-mixins

    它允许我们在CSS中定义和调用JavaScript函数,就像在Sass或Less中使用mixin一样。通过这种方式,我们可以创建可重用的样式块,提高代码的组织性和效率。 **三、使用方法** 1. **安装**:首先,你需要通过npm(Node....

    前端开源库-compass-mixins

    Compass Mixins 是一个非常重要的前端开发工具,尤其在 Sass(Syntactically Awesome Style Sheets)环境中,它极大地提升了CSS编写效率和代码复用性。这个开源库为开发者提供了丰富的预定义混合(mixins),帮助...

    Python库 | django-mixins-0.0.3.tar.gz

    通过使用这个库,开发者可以方便地在Django视图或模型中引入混入(mixins)模式,提高代码的组织结构和效率。 **混入(Mixins)模式** 混入是一种面向对象的设计模式,它允许你将一组通用功能分散到多个类中,而...

    scss-mixins-variables

    这个程序包提供了我在个人项目中一直使用的各种mixin和变量。 安装 NPM 使用NPM安装: npm install --save sass-mixins-variables 导入到您的主要SCSS文件中: // Import Variables (beta) @import ' node_...

    sass-css3-mixins, Sass Mixins 跨浏览器 Sass库 !.zip

    sass-css3-mixins, Sass Mixins 跨浏览器 Sass库 ! Sass ! 跨浏览器 CSS3库。通过:Matthieu Aussaguel, @mattaussaguel需要 @imported 和 @included的CSS3 Sass mixin文件列表这个库的目的是为了在不同浏览器上...

    vue-setup-mixins:vue-setup-mixins

    Practice_s19-s20项目设置npm install编译和热重装以进行开发npm run serve编译并最小化生产npm run build整理和修复文件npm run lint自定义配置请参阅。

    前端开源库-compass-mixins.zip

    在 Compass Mixins 中,我们可以找到一系列预先定义好的混合(mixins),这些混合覆盖了 CSS3 的各种新特性,例如渐变(gradients)、边框半径(border-radius)、阴影(shadows)、响应式设计(media queries)等。...

    polymer-siren-mixins:共享mixins的实用程序库,用于构建基于警报器资源的Web组件

    在JavaScript中,mixins允许我们将一系列功能添加到一个类中,从而避免了复杂的继承结构和重复代码。`polymer-siren-mixins`就是为Polymer组件设计的这种功能集合,使得处理警报(Siren)资源变得更加简便。 Siren...

    rs-mixins:我们为 Underscore 对象定制的函数

    在`rs-mixins`的应用程序接口(API)中,你可以找到一系列用于操作数据、处理集合或者增强对象的函数。这些函数可能是对Underscore原有功能的补充,或者是完全新的功能。例如,可能包含对数组处理的新方法,如更复杂的...

    styled-components-mixins:将流行的框架与样式化组件一起使用

    这个项目是*-mixins的一部分,目的是为被React感染的人们提供更好的CSS体验。安装用 // import classes you need from the library you need. import { class1 , class2 } from 'styled-components-mixins/{LIBRARY}...

    ember-singularity-mixins:Mixins利用Ember奇异性的力量

    灰烬奇异混合 此插件使用... 它们还具有一个函数钩子,该函数钩子使用与其处理的事件相同的名称。 换句话说,对于scroll-handler混合而言,它只是: import ScrollHandler from 'ember-singularity-mixins/mixins/scro

    es6-mixins:一种将 mixin 方法和函数添加到 es6 类和React组件的简单方法

    第二个参数是添加这些方法的上下文,如果在构造函数中使用它应该设置为 this。 最简单的例子只是在下面的 yourClass 中添加 someFunction 。 class YourClass { constructor ( ) { mixins ( somefu

    classy-mixins:Angular Classy 的 Mixins 插件

    经典的mixin ... 安装 用bower安装: bower install classy-mixins ... &lt; script src =" /bower_components/angular/angular.js " &gt;... 将classy和classy-mixins添加到您的应用程序模块中。 var app = angular .

    scss-mixins:scss mixin和函数的集合,以简化和改进常见样式代码模式的实现

    SCSS(Sass)是一种流行的CSS预处理器,它扩展了CSS语法,允许开发者使用变量、嵌套规则、混合(mixins)、函数等特性,从而提高样式表的可维护性和复用性。`scss-mixins`是一个开源项目,提供了一系列预定义的SCSS ...

    vue-named-mixins:按名称注册和访问mixins

    在Vue中,`mixins`是一个强大的特性,允许开发者共享和复用组件之间的方法和选项。`vue-named-mixins`是针对Vue的一个扩展库,它提供了一种按名称注册和访问`mixins`的方法,这在大型项目中可以增强代码的组织性和可...

    SASS-Useful-Mixins:有用的SASS Mixins

    有用的SASS Mixins 如果您使用的是SASS,则应该发现这些mixins确实很有帮助。 这些mixins应该有助于加快您的开发过程。 该文件包括用于REM单元后备支持的SASS mixins,视网膜图像,断点,动画,过渡,线性渐变,...

    scss-mixins-collection:方便的scss mixins的集合

    SCSS-MIXINS-COLLECTION 方便的scss mixins的集合。安装您可以通过npm安装它: npm install --save-dev scss-mixins-collection 或者,如果愿意,可以通过Bower: bower install scss-mixins-collection然后只需@...

    css3-sass-mixins:Sass mixins 使在 Sass 或 SCSS 驱动的项目中使用 css3 变得容易

    CSS3 的 SASS 混合(供应商前缀/过滤器)关于类似于 ,这个 repo 将尝试让我们在日常项目中更容易使用 css3。 如果您使用的是 vanilla CSS,CSS3 Please 工作正常,但对于我们这些使用 SASS(或 SCSS)的人来说,这...

    postcss-classes-to-mixins:智能地将CSS类转换为SASS,Less和Stylus mixins

    插件可将CSS类智能地转换为SASS,Less和Stylus mixins。 安装 npm install postcss-classes-to-mixins 例子 输入: /* style.css */ . red-btn { background : red; color : white; } 输出: /* style.scss */ ...

    Flexbox-mixins

    Flexbox-mixins 在 Web 应用程序中使用 CSS Flex 框模型时,这些混合是我开始的地方。 我希望随着我使用 flex 开发更多应用程序,这些应用程序将演变成一个模块化 mixin 包,用于快速引导 Web 应用程序 UI 布局。

Global site tag (gtag.js) - Google Analytics