当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何让Rails在应用程序代码之后加载插件*?》经验,为你挑选了1个好方法。

我正在尝试编写一个定义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:MongoMapper :: Connection`中未初始化的类变量@@ database_name

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



1> Helder S Rib..:

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

具体错误

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

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

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会自动添加到加载路径).这样,模型只会被requireRails的自动类加载器引用,它们通常位于应用程序代码中.到那时,数据库连接已经建立.当然,如果你确实这仅适用并不需要你的插件的初始化过程中引用这些类.否则,请继续阅读.

一般问题

如何让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 提供给您的插件,无需额外费用.

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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有