Как создать и использовать модуль с использованием Ruby on Rails 3? - PullRequest
90 голосов
/ 05 февраля 2011

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

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

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

Ответы [ 2 ]

114 голосов
/ 05 февраля 2011

To 1. Модуль создается / открывается просто говоря:

module MyModule
  def first_module_method
  end
end

To 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 и добавить туда свой модуль.

3 голосов
/ 05 февраля 2011

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

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

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

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

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...