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

Классы полезности в Ruby on Rails

Это, наверное, глупый вопрос, но я новичок в Ruby on Rails, и я мог бы использовать небольшое руководство. Я хочу иметь класс helper/utility, который выполняет группу сетевых операций и возвращает результаты. Где я помещаю этот класс и как его использовать.

Я создал network_helper.rb в каталоге моего приложения /modulename/helpers. В моем контроллере, когда я пытаюсь сделать

  myNetworkHelper = ModuleName::NetworkHelper.new
  results = myNetworkHelper.getResults

Я получаю сообщение об ошибке

 undefined method `new' for MyModule::NetworkHelper:Module

Я уверен, что это просто непонимание того, как работает рубин на рельсах. Могу ли я получить разъяснения?

Было бы лучше сделать этот класс вместо модуля и поместить его в libs? И могу ли я добавить подпапки в libs и автоматически загрузить их?

4b9b3361

Ответ 1

Чтобы использовать new, то, что ваш вызов должен быть классом, а не модулем. Вы используете модуль. Измените module на class в lib/utilities/network_utility.rb.

Ответ 2

Lib или Классы

Небольшие классы полезности, подобные этому, обычно входят в папку lib, хотя некоторые люди предпочитают создавать папку под названием classes. Какой бы вы ни выбрали, убедитесь, что вы импортируете папку в config/application.rb, так как папка lib не загружена автоматически:

config.autoload_paths += %W(#{config.root}/lib)

Обеспокоенность

Если вместо класса утилиты вы хотите расширить некоторые из своих моделей с помощью многоразового кода, вы также можете посмотреть новые папки Rails 4, которые помогут вам извлечь повторно используемые модули:

см. Как использовать проблемы в Rails 4

Ответ 3

Я не могу проверить это на данный момент, однако я считаю, что одно место, где вы можете хранить свои настраиваемые модули и классы, - это каталог lib. Кроме того, вы должны иметь возможность хранить их в каталоге app так, как вы указали, добавив следующую строку в вашу среду. Rb:

config.load_paths << File.join(Rails.root, "app", "modulename")

Кроме того, проверьте ответ Yehuda Katz, который, я думаю, не только лучше отвечает на ваш вопрос, но также содержит очень интересную и полезную информацию и концепции, касающиеся вашей ситуации, Надеюсь, что это поможет!