gpt4 book ai didi

ruby-on-rails - 如何让 Rails 在应用程序代码之后*加载插件?

转载 作者:行者123 更新时间:2023-12-04 14:06:47 24 4
gpt4 key购买 nike

我正在尝试编写一个定义 MongoMapper 模型的插件。问题是当我运行 script/console 时,我收到此错误:
/home/helder/.rvm/gems/ruby-1.8.7-p249/gems/mongo_mapper-0.8.2/lib/mongo_mapper/connection.rb:29:in``database':NameError: 未初始化的类变量 @@database_name 在 MongoMapper::Connection`

这让我认为它在设置数据库连接之前尝试加载我的插件模型。我如何让它在我的应用程序代码的其余部分之后加载插件?

最佳答案

我将尝试解决我遇到的错误以及标题中所述的一般问题。

具体错误

我想出了问题所在。正如我在上面的评论中所说,问题在于 Rails (2.3.8) 在使用 ActiveRecord 时,首先设置数据库连接,然后加载 gems,然后加载插件(按此顺序)。因此,如果您有任何需要在初始化期间访问数据库的插件(即,在插件的 init.rb 或此文件的其他文件 require d 中),一切正常。

但是当使用 MongoMapper 时,Rails 将 MongoMapper 的类与所有其他 gems/插件一起加载,但不设置其连接(Rails 不这样做,插件本身也不会触发它)。目前在MongoDB's documentation上推荐的方式是创建一个这样的初始化程序:

MongoMapper.connection = Mongo::Connection.new('localhost', 27017)
MongoMapper.database = "#myapp-#{Rails.env}"

if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
MongoMapper.connection.connect_to_master if forked
end
end

但是由于插件在 config/initializers 中的文件之前被初始化正在运行,如果您尝试定义 MongoMapper 模型,一旦它获得访问数据库的调用(如对 key 类方法的调用),BOOM。您会收到问题中引用的错误。

解决此问题的一种方法是 不是 要求在 init.rb需要数据库的文件,而只是将它们添加到加载路径中(如果它们不在 lib/app/models 中,Rails 会自动添加到加载路径中)。这样,模型只会是 require d 被 Rails 的自动类加载器引用时,它们通常位于您的应用程序代码中。到那时,数据库连接将已经建立。当然,这仅适用于您确实 不要需要在插件初始化期间引用这些类。否则,请继续阅读。

一般问题

初始化代码后如何让Rails加载插件?

在您插件的 init.rb 上, 抛出任何需要在这个块内等待的东西:
config.after_initialize do
# require my models
# do this
# do that
end

那个 config变量与传递给传递给 Rails::Initializer.run 的块相同在您的 config/environment.rb 内文件,并且可用于您的插件的 init.rb通过 Rails 无需额外费用。

您放入该块中的任何内容都将被执行(通过 Rails::Initializer#after_initialize ) 一切都已完成加载和初始化,但是 之前 任何要求进来。享受。

关于ruby-on-rails - 如何让 Rails 在应用程序代码之后*加载插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3116204/

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