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


90

Я використовую Ruby on Rails 3, і я хотів би перемістити якийсь користувацький та спільний код у модулі.

  1. Який синтаксис слід використовувати для написання коду модуля?
  2. В яку папку моєї програми я повинен помістити файл модуля?
  3. Як мені включити цей модуль до одного або декількох класів контролера?
  4. Яку ще дію, якщо така є, я повинен використовувати спеціальний модуль в будь-якому місці моєї програми?
  5. Як я можу викликати методи в модулі з моєї програми?

Заздалегідь спасибі.


2
Дуже добре! Мені це було потрібно.
Arup Rakshit

Відповіді:


115

До 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

2
@ user502052 Я оновив відповідь до пункту 2, щоб відповісти на це запитання.
Stephan

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
Я щойно знайшов цю свою стару відповідь. :( Я хочу downvote. Є чи що - небудь в Lib не ставити! Помістіть свій код ( в тому числі додаткових модулів) в app/modelsразі , якщо код повинен мати доступ до інших моделей. Якщо код дійсно «бібліотека» і може існувати сам по собі, я пропонуємо продати дорогоцінний камінь. Для прикладів див. github.com/shageman/the_next_big_thing
Стефан

3

A> 1. Ви можете використовувати той самий синтаксис, що і будь-який інший клас рубіну. Наприклад, я визначаю модуль 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

у класі, в якому ви використовуєте модуль, і ви матимете доступ до всіх методів модуля.

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


2
Я спробував це і отримав невизначену помилку методу. Будь-яке уявлення про те, що я роблю не так?
Тоні

Ви впевнені, що ваш модуль доступний? stackoverflow.com/questions/6604272/ ... можливо, допоможе вам?
Шреяс

1
@Tony - Можливо, вам доведеться перезапустити сервер - навіть у режимі розробника, щоб отримати доступні методи модуля. І кожного разу, коли ви змінюєте код у своєму модулі, ви повинні перезапустити сервер знову. Наприклад, якщо помилка або вона виведе помилку зі старим кодом, але виділіть новий код у цьому рядку в повідомленні про помилку - дуже заплутано.
JosephK

Будь-яка ідея, як включити та використовувати ці спеціальні модулі всередині ApplicationHelper?
WM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.