ruby-on-rails - 使用 Ruby 别名扩展 Gem

标签 ruby-on-rails ruby

这更像是一个理论问题,但我还是很好奇。我是 ruby​​/ruby​​ on rails 新手(但在其他语言/框架方面有很多古老的经验)所以这主要是一个好奇/学习问题。在此先感谢您的帮助!

我想我可以使用如下别名对 ruby​​ gem 进行快速扩展:

module InstallMyExtension
  def self.included(base)
    base.class_eval {
      alias :some_method_in_gem_without_my_extension :some_method_in_gem
      alias :some_method_in_gem :some_method_in_gem_with_my_extension
    }
  end

  def some_method_in_gem_with_my_extension
    debugger
    # ... do fun stuff here
    some_method_in_gem_without_my_extension
  end

end

然后在我做的一些初始化文件中:

Foo::SomeControllerInFoo.send :include, InstallMyExtension

我在 Radiant CMS 中学到了这项技术,它在整个地方都被用来扩展基本行为。我知道这种技术现在不被认可,但它似乎是一种快速尝试一些想法的方法,然后在 gem 上 fork 分支,等等

首先,在 Rails 3 中有没有更好的方法来进行像这样的快速 hack 扩展(这可能只是为了测试一个理论,在 fork gems 等之前有用???)

其次,它不工作,有很多事情我不明白

然后让我解释一下我看到的奇怪现象:

即使如果我确实执行了如上所示的“include”,当我进入控制台时,我也会看到一些我不明白的非常奇怪的行为:

1) 我输入 Foo::SomeControllerInFoo,我按预期返回 Foo::SomeControllerInFoo。但是,如果第二次运行完全相同的表达式,Foo::SomeControllerInFoo 会返回未定义的状态!

2) 只是为了玩耍,我做了 foo = Foo::SomeControllerInFoo,然后我可以做 foo.send、foo.methods,无论我喜欢什么,但前提是我将类的副本保存在 foo 中!这是怎么回事?

3) 如果我现在执行 foo.send :include, MyExtension 调试控制台中的行为符合预期(即 gem 中包含的原始类现在添加了我的行为。)但是在初始化期间运行相同的代码没有效果。没有中断,但 Controller 没有扩展。

最佳答案

奇怪的是它不起作用,我只是再次尝试以确保成功(将此代码放在 config/initializers 中的文件中)。

我总是使用快捷方式:

alias_method_chain :some_method_in_gem, :my_extension

而不是两条别名行,但完全一样。

您可以直接使用 class_eval 更轻松地覆盖一些方法。再次在初始化程序中:

Foo::SomeControllerInFoo.class_eval do
  def some_method_in_gem
   #your redefinition
  end
end

抱歉,您的其他问题没有附加值(value):看起来真的很奇怪而且有问题。


只是为了确定,当你想运行在你的 Controller 中定义的方法时,做:

c = Foo::SomeControllerInFoo.new
c.method_name

关于ruby-on-rails - 使用 Ruby 别名扩展 Gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801801/

相关文章:

ruby-on-rails - 名称错误 : undefined local variable or method `params' for main:Object

javascript - 如何测试 create.js.erb 文件中哪个页面发送了 AJAX 请求?

ruby-on-rails - Rails 加载模块链时遇到问题

ruby-on-rails - Ruby 2.0.0,而不是 Rails 站点上推荐的 2.1.0?

ruby-on-rails - URI::InvalidURIError(URI 只能是 ascii)

ruby-on-rails - 在 Rails 4 中使用强参数值白名单

javascript - bootstrap 下拉菜单在 Heroku 上不起作用

ruby-on-rails - 在 ruby​​ 对象上调用 .save 只为所有字符串传递 nil

ruby - 与 Ruby 中的对象混淆

ruby-on-rails - 可以在 Thread::handle_interrupt block 之外异步处理 ruby​​ 异常吗?