gpt4 book ai didi

ruby-on-rails - Rails 3 - 扩展存在于 gem 或插件中的模型

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

在 RefineryCMS gem 中有一个页面模型,用于从 CMS 中提取信息。该模型未在您当前的应用程序中定义,因此您无法修改其代码(除非您跳转到 gem 代码)。

有没有一种方法可以修改现有模型中的方法,而不必在每次加载页面时都应用更改?这是我尝试过的:

  1. 模型.class_eval

  2. Model.send :include, MixinThatHasNewMethods

我还尝试使用更新后的方法创建一个新类,并希望这会更新现有类。

有什么想法吗?

最佳答案

Ruby 允许开发人员随时“更新”任何对象。

这意味着在 RefineryCMS 加载 Model 之后,您可以重新打开类并更新它:

class Model
def new_method(value)
...
end

def existing_method(*args)
...
super # refer to the ovewriten method
end
end

在您的情况下,RafineryCMS 是一个 RoR 应用程序,这意味着在加载服务器时,首先为 rails 框架加载 ruby​​ 代码,然后为 RafineryCMS gem/插件加载,最后为您的自定义库(例如:lib 文件夹)加载。

这里重点是代码的加载顺序,修改应该在真正的类代码之后加载。

那是在你的库或初始化器中(不是一个真正的好地方,但它有效)你应该为 Model 类放置你的自定义方法。

编辑:我再次阅读了您的问题,我不得不提一下,您错了,您实际上可以从 gem 或插件更改类。ruby 加载同一范围内的每个对象,所有对象都可以访问并被覆盖。

在开发环境中,RoR 在每次请求时重新加载所有类(除非 cache_classes = false)。有可能,在第一次请求之后,gem 被重新加载并且您的更改丢失了。请注意在每次请求后重新加载您的库(仅在开发环境中)

PS: include & class_eval 也可以,重要的是覆盖之前加载的类

关于ruby-on-rails - Rails 3 - 扩展存在于 gem 或插件中的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7649111/

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