Где разместить пользовательские классы, чтобы сделать их глобально доступными для приложения Rails? - PullRequest
23 голосов
/ 18 февраля 2012

У меня есть класс, который я пытаюсь использовать в своем контроллере в действии index.

Чтобы упростить это, это выглядит так

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

Ответы [ 3 ]

26 голосов
/ 18 февраля 2012

Вы должны быть в состоянии использовать require 'front_page', если вы размещаете front_page.rb где-нибудь на пути загрузки.Т.е. это должно работать:

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 каталоге, поэтому будьте осторожны).

7 голосов
/ 18 февраля 2012

Файл был назван FrontPage.rb. Изменение имени на front_page.rb, но оставление имени класса как FrontPage решило проблему.

4 голосов
/ 18 февраля 2012

Нам просто нужно загрузить файл,

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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...