【问题标题】:Why "require" cannot find a file in Ruby on Rails 3 application?为什么“require”在 Ruby on Rails 3 应用程序中找不到文件?
【发布时间】:2011-05-22 15:11:42
【问题描述】:

我会在应用程序启动时使用一些虚拟条目填充数据库 (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,等等)?

【问题讨论】:

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


    【解决方案1】:

    问题 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
    

    【讨论】:

    • 谢谢!这真的很有帮助。还有一个问题:你的代码中create!create 有什么区别?
    • 创建!如果失败则抛出异常,而 create 只返回 false。这是 ActiveRecord 中的一种常见模式,但通常在 ruby​​ 中是一个 bang_method!表示该方法直接改变接收者而不是返回一个新对象。请参阅 Array#reverse 和 Array#reverse!
    • 谢谢!在数据库中创建记录时是否总是建议使用create! 而不是create(我想知道是否出现问题)?
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,从现在开始我一定会使用db/seeds.rb
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2011-04-27
      • 2011-01-11
      相关资源
      最近更新 更多