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

Как я могу использовать миксины или модули в своих контроллерах в Rails 3?

У меня есть какое-то поведение в моем контроллере, которое я вытащил в модуль, чтобы лучше проверить и повторно использовать его в нескольких местах. Два вопроса:

  • Где хорошее место для размещения моих модулей? Они должны запускаться для доступа к контроллерам, поэтому я думал о директории config/initializers/. Это кажется мне немного подозрительным. lib/?
  • Как обеспечить, чтобы код запускался, поэтому модули доступны для include в моих контроллерах?

Благодарим вас, господа.

4b9b3361

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