为什么“require”无法在Ruby on Rails 3应用程序中找到文件?

时间:2010-12-09 03:47:59

标签: ruby-on-rails ruby-on-rails-3 require

我会在应用程序启动时用一些虚拟条目填充数据库(MySQL)。

我创建了:

class DatabaseInitializer
  def populate_database
    ...
  end
end
lib/database_initializer.rb中的

我知道lib目录中的所有文件都应该自动加载。

问题1:是否有任何命令可以查看已加载的所有文件的列表?

然后,在controllers/main_controller.rb我有:

require 'lib/database_initializer.rb'
class MainController < ApplicationController
  def initialize
    DatabaseInitializer.new.populate_database
  end
  def index
    ...
  end  
end

但是,我收到了以下错误:

LoadError in MainController#index
no such file to load -- lib/database_initializer.rb

问题2:为什么找不到database_initializer.rb

问题3:这种“Rails足够”的方式来预先填充数据库吗?你会这样做吗(把database_initializer.rb放在其他地方,从其他地方打电话给DatabaseInitializer.new.populate_database,电子邮件)?

3 个答案:

答案 0 :(得分:3)

问题1

$LOADED_FEATURES

问题2

# the 'lib' directory is already added to the load
# path in the Rails initialization process, so simply:
require 'database_initializer`

问题3

# db/seeds.rb
c = Company.create! :name => 'ABC Inc.'
p = Person.create! :name => 'Jeremy', :company => c

$ rake db:seed

答案 1 :(得分:2)

当需要来自ruby的文件时,通常会删除文件扩展名。试试require database_initializer。从rails-3的加载路径中删除了lib/,但我认为现在已经回来了。如果没有,请参阅config.autoload_paths中的config/application.rb

但是,我认为这可能是个坏主意。如果您需要确保始终为应用程序提供一致且不可变的数据集,为什么不在模型中的ruby中定义它?

此外,还有一种在rails中添加种子数据的机制。请参阅db/seeds.rb和命令rake db:seed

答案 2 :(得分:1)

对于lib中的任何文件,您只需使用:require 'database_initializer'