Подтвердить что ты не робот

Куда поместить пользовательские классы, чтобы сделать их доступными в глобальном масштабе для приложения 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

4b9b3361

Ответ 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)

Второй вариант будет предпочтительным решением.