Как создать и использовать модуль с помощью Ruby on Rails 3?

90

Я использую Ruby on Rails 3 и хочу переместить в модуль некоторый собственный и общий код.

  1. Какой синтаксис использовать для написания кода модуля?
  2. В какой папке моего приложения я должен разместить файл модуля?
  3. Как мне включить этот модуль в один или несколько классов контроллеров?
  4. Какие еще действия, если они есть, я должен использовать в любом месте моего приложения?
  5. Как я могу вызывать методы в модуле из моего приложения?

Заранее спасибо.

user502052
источник
2
Очень хорошо! Мне нужно это.
Аруп Ракшит

Ответы:

116

Кому 1. Модуль создается / открывается простым сообщением:

module MyModule
  def first_module_method
  end
end

К 2. libПапка. Если вы хотите организовать свои модули в libпапке, вы можете поместить их в сами модули. Например, если вам нужна подпапка, super_modulesваши модули будут определены следующим образом:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

К 3./5. При включении модуля в класс вы можете просто вызвать методы модуля, как если бы они были определены внутри класса:

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

Для 4. Во-первых, убедитесь, что ваш модуль действительно нужен в каждом классе вашего приложения. Если это не так, имеет смысл включать его только там, где это необходимо, чтобы в любом случае не раздувать классы, которым он не нужен. Если вам действительно нужен модуль везде, включите в него иерархию классов ваших классов в приложении. Вы хотите, чтобы модуль был во всех моделях? Вы можете открыть ActiveRecord :: Base и добавить туда свой модуль.

Стефан
источник
2
Могу ли я создать подпапку в папке lib для организации файлов? Если да, то что изменится?
user502052 05
2
@ user502052 Я обновил ответ на пункт 2, чтобы ответить на этот вопрос.
Стефан
3
Здесь многое неясно. Какие имена файлов давать? Как вызвать методы, когда не включен весь модуль? Я не могу поверить, что так много положительных отзывов, потому что я до сих пор не знаю, как использовать модуль в конце.
Огюстен Ридинджер,
5
После того, как вы создадите модуль, как указано выше, включив его в libпапку, важно разрешить Rails3 раскомментировать строку config\application.rbдля config.autoload_paths- прочтите, например, stackoverflow.com/questions/1073076/rails-lib-modules-and ... Примечание также вы должны быть осторожны, чтобы использовать имя файла для вашего модуля, которое соответствует самому имени модуля. Так что если вы сохраните его в lib/test/my_module.rb, вы должны include Test::MyModule- для получения более подробной информации см stackoverflow.com/questions/4073856/rails-3-autoload
sameers
6
Я только что нашел свой старый ответ. :( Я хочу проголосовать против. Не помещайте ничего в lib! Поместите свой код (включая дополнительные модули), app/modelsесли ему нужен доступ к другим моделям. Если ваш код действительно является «библиотекой» и может существовать сам по себе, я предлагаем продать драгоценный камень. Примеры см. на странице github.com/shageman/the_next_big_thing
Stephan
3

А> 1. Вы можете использовать тот же синтаксис, что и любой другой класс ruby. Например, я определяю модуль VehicleClassifer, который будет использовать метод classify_vehicle для классификации транспортного средства на основе количества колес, которые он получает в качестве входных данных.

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

А> 2. Модули обычно хранятся в папке / lib.

вопросы 3,4,5 имеют более или менее одинаковые ответы. ты можешь использовать

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

в классе, в котором вы используете модуль, и у вас будет доступ ко всем методам модуля.

Кроме того, если вам нужно использовать модуль в своем приложении, вы можете включить его в свой контроллер приложения.

Шреяс
источник
2
Я попробовал это и получил ошибку неопределенного метода. Есть идеи, что я делаю не так?
Тони
Вы уверены, что ваш модуль доступен? stackoverflow.com/questions/6604272/… может быть, вам поможет?
Shreyas
1
@Tony - вам может потребоваться перезагрузить сервер - даже в режиме разработки, чтобы методы модуля были доступны. И каждый раз, когда вы меняете код в своем модуле, вы должны перезапускать сервер снова. Например, если возникла ошибка, или она выйдет из строя в старом коде, но выделит новый код в этой строке в сообщении об ошибке - очень запутанно.
JosephK
Есть идеи, как включить и использовать эти настраиваемые модули внутри ApplicationHelper?
WM