Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – 如何在应用程序代码之后使Rails加载插件*?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个定义MongoMapper模型的插件.问题是,当我运行脚本/控制台时,我收到此错误:

/home/Helder/.rvm/gems/ruby-1.8.7-p249/gems/mongo_mapper-0.8.2/lib/mongo_mapper/connection.rb:29:in
“database’:NameError:MongoMapper :: Connection`中未初始化的类变量@@ database_name

这让我觉得它在设置数据库连接之前试图加载我的插件模型.如何在其余的应用程序代码之后加载插件?

解决方法

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

具体错误

我弄清楚问题是什么.正如我在上面的评论中所说,问题是Rails(2.3.8)在使用ActiveRecord时首先设置数据库连接,然后加载gems,然后加载插件(按此顺序).因此,如果你有任何插件需要在初始化期间访问数据库(也就是说,在插件的init.rb或其他所需的文件中),一切正常.

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

@H_9_17@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模型,只要它进入访问数据库的调用(如调用键类方法),BOOM即可.您会收到问题中引用的错误.

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

一般问题

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

你的插件的init.rb上,抛出需要在这个块内等待的任何东西:

config.after_initialize do
  # require my models
  # do this
  # do that
end

该config变量与传递给config / environment.rb文件中的Rails :: Initializer.run的块相同,并且Rails可以为您的插件的init.rb提供,无需额外费用.

在完成所有加载和初始化之后,但在任何请求进入之前,您放入该块中的任何内容都将被执行(到Rails::Initializer#after_initialize).享受.

大佬总结

以上是大佬教程为你收集整理的ruby-on-rails – 如何在应用程序代码之后使Rails加载插件*?全部内容,希望文章能够帮你解决ruby-on-rails – 如何在应用程序代码之后使Rails加载插件*?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。