gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:58 24 4
gpt4 key购买 nike

这更像是一个理论问题,但我还是很好奇。我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com