Как я могу использовать миксины или модули в моих контроллерах в Rails 3? - PullRequest
27 голосов
/ 15 октября 2010

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

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

Спасибо, господа.

Ответы [ 3 ]

38 голосов
/ 16 октября 2010
  1. lib/ - отличное место для модулей;намного лучше чем config/initializers/ - по крайней мере, на мой взгляд.Если это несколько модулей или один большой, вы также можете сделать плагин и поместить его в vendor/plugins.

  2. Если вы введете его в 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!"
1 голос
/ 14 августа 2012

1) Мне нравится помещать: мои расширения класса в app / extensions, мои модули в / app / mixins мои сервисы в / app / services

2) Вы можете настроить свое приложение для загрузки всех этих вconfig / application.rb: расширения классов должны быть указаны правильно, а миксины и сервисы могут быть добавлены в путь автозагрузки

  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', '{**}')]

(я использую rails 3)

0 голосов
/ 23 сентября 2011

Попробуйте поместить специальные модули контроллера в app/controllers. Нет require требуется.

...