2012-02-18 2 views
22

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

+3

Вы пробовали 'требовать 'front_page''? – Mischa

+0

@Mischa Да, все те, которые требуют аргументов, должны быть заключены в кавычки. Спасибо что подметил это. Использование этого 'require' приводит к ошибке' не может загрузить такой файл - front_page' –

ответ

4

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

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) 

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

+0

Да, я пробовал это. Я помещаю его вне определения класса, но теперь проверяю, что его определение внутри класса по-прежнему дает 'невозможно загрузить такой файл - front_page.rb' –

7

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

+3

Соглашение не является специфичным для Java. http://en.wikipedia.org/wiki/CamelCase – 0112

23

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

+0

автозагрузка - это ключ – Donato

+0

спасибо - вопрос: опасно ли или опасно автозагрузка * все * в каталоге lib? – BKSpurgeon

Смежные вопросы