Как я могу использовать миксины или модули в своих контроллерах в Rails 3?
У меня есть какое-то поведение в моем контроллере, которое я вытащил в модуль, чтобы лучше проверить и повторно использовать его в нескольких местах. Два вопроса:
- Где хорошее место для размещения моих модулей? Они должны запускаться для доступа к контроллерам, поэтому я думал о директории
config/initializers/
. Это кажется мне немного подозрительным. lib/
?
- Как обеспечить, чтобы код запускался, поэтому модули доступны для
include
в моих контроллерах?
Благодарим вас, господа.
Ответы
Ответ 1
-
lib/
- отличное место для модулей; намного лучше, чем config/initializers/
- по крайней мере, на мой взгляд. Если это несколько модулей или один большой, вы также можете рассмотреть возможность создания плагина и размещения его в vendor/plugins
.
-
Если вы поместите его в lib/
, вам нужно вручную require
сохранить файл. Rails по умолчанию не загружает файлы в каталог lib/
. Вы можете разместить запрос в одном из ваших конфигурационных файлов.
Обычно я добавляю свои дополнительные автозагрузки в config/application.rb
. Что-то вроде этого должно сделать трюк (предполагая, что ваш файл .rb
находится в каталоге с именем lib/my_module
):
config.autoload_paths += Dir["#{Rails.root}/lib/my_module"]
Вы должны убедиться, что ваш модуль является фактическим module
, а не class
. Затем вы можете просто включить его:
# lib/my_module/foobar.rb
module Foobar
def foobar
"Hello world!"
end
end
# app/models/my_model.rb
class MyModel < ActiveRecord::Base
include Foobar
end
# rails console
>> obj = MyModel.first
=> #<MyModel id: 1, ...>
>> obj.id
=> 1
>> obj.foobar
=> "Hello world!"
Ответ 2
1) Мне нравится ставить: размеры моего класса в приложениях/расширениях мои модули под /app/mixins мои услуги в разделе /app/services
2) Вы можете настроить приложение для загрузки всех этих файлов в config/application.rb:
класс должен быть исправлен
и mixins и сервисы могут быть добавлены к вашему пути автозагрузки
class Application < Rails::Application
# require class extentions right now
Dir[Rails.root.join('app', 'extentions', "*.rb")].each {|l| require l }
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += Dir[Rails.root.join('app', 'mixins', '{**}')]
config.autoload_paths += Dir[Rails.root.join('app', 'services', '{**}')]
(Я использую рельсы 3)
Ответ 3
Попробуйте установить определенные модули контроллера в app/controllers
. Нет require
.