Куда поместить пользовательские классы, чтобы сделать их доступными в глобальном масштабе для приложения Rails?
У меня есть класс, который я пытаюсь использовать в моем контроллере в действии индекса.
Чтобы упростить это, он выглядит как
class PagesController < ApplicationController
def index
@front_page = FrontPage.new
end
end
FrontPage
- это класс, который я определил. Чтобы включить его, я поместил его в папку /lib/. Я попытался выполнить require 'FrontPage'
, require 'FrontPage.rb'
, require 'front_page'
и каждый из них с добавленным путем, например require_relative '../../lib/FrontPage.rb'
Я получаю одно из следующих сообщений: cannot load such file -- /Users/josh/src/ruby/rails/HNReader/lib/front_page
или
uninitialized constant PagesController::FrontPage
Где я помещаю этот файл/как его включить в контроллер, чтобы создать экземпляр объекта?
Это Rails 3.1.3, Ruby 1.9.2, OS X Lion
Ответы
Ответ 1
Вы можете использовать require 'front_page'
, если вы размещаете front_page.rb
где-то в вашем пути загрузки. I.e: Это должно работать:
require 'front_page'
class PagesController < ApplicationController
def index
@front_page = FrontPage.new
end
end
Чтобы проверить свой путь загрузки, попробуйте следующее:
$ rails console
ree-1.8.7-2011.03 :001 > puts $:
/Users/scottwb/src/my_app/lib
/Users/scottwb/src/my_app/vendor
/Users/scottwb/src/my_app/app/controllers
/Users/scottwb/src/my_app/app/helpers
/Users/scottwb/src/my_app/app/mailers
/Users/scottwb/src/my_app/app/models
/Users/scottwb/src/my_app/app/stylesheets
# ...truncated...
В этом примере вы можете увидеть, первая строка - это каталог проекта lib
, в котором вы сказали, что ваш front_page.rb
живет.
Еще одна вещь, которую вы можете сделать, - добавить это в свой config/application.rb
:
config.autoload_paths += %W(#{config.root}/lib)
Это должно сделать так, чтобы вам не понадобился require
; вместо этого Rails будет автоматически загружать его (и все остальное в вашем каталоге lib
, поэтому будьте осторожны).
Ответ 2
Файл был назван FrontPage.rb
. Изменение имени на 'front_page.rb', но оставив имя класса как "FrontPage", разрешило проблему.
Ответ 3
Нам просто нужно загрузить файл,
class PagesController < ApplicationController
require 'front_page.rb'
def index
@front_page = FrontPage.new
end
end
Библиотека/front_page.rb
class FrontPage
end
Мы также можем установить application.rb
в автозагрузку этих файлов
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
Второй вариант будет предпочтительным решением.