Почему «require» не может найти файл в приложении Ruby on Rails 3? - PullRequest
1 голос
/ 09 декабря 2010

Я бы заполнил базу данных (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 ]

3 голосов
/ 09 декабря 2010

Вопрос 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
2 голосов
/ 09 декабря 2010

При запросе файлов от ruby ​​вы обычно отбрасываете расширение файла. Попробуйте require database_initializer. lib/ был кратко удален с пути загрузки в рельсах-3, но я думаю, что он вернулся. Если нет, см. config.autoload_paths в config/application.rb.

Тем не менее, я думаю, что это, вероятно, плохая идея в целом. Если вам необходимо убедиться, что у вас всегда есть согласованный и неизменный набор данных, доступных для вашего приложения, почему бы просто не определить его в ruby ​​в модели?

Кроме того, уже существует механизм добавления начальных данных в рельсы. Смотрите db/seeds.rb и команду rake db:seed

1 голос
/ 09 декабря 2010

Для любого файла в lib вы должны использовать только: require 'database_initializer'.

...