Где разместить многоразовые методы для доступа контроллеров в рельсах - PullRequest
25 голосов
/ 28 апреля 2010

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

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

Я пришел из Java и Actionscript, где я просто создал бы новые классы утилит для этого материала.

Ответы [ 5 ]

13 голосов
/ 28 апреля 2010

Каталог lib - это место, куда вы можете поместить модули / классы, которые могут быть смешаны или использованы контроллерами (и всем остальным, на самом деле). Это может быть место для размещения кода, который не попадает в другие области (но будьте осторожны, чтобы убедиться, что lib не превратится в беспорядок). Дополнительные комментарии, чтобы иметь в виду:

  • Если вы знаете, что у вас есть большое количество связанных функций, которые могут или будут использоваться в других приложениях, это может быть плагин.

  • Стоит также помнить, что нет ничего плохого в создании модели, которая не является объектом Active Record. Опять же, в зависимости от того, что у вас есть, это также может иметь смысл.

11 голосов
/ 26 марта 2014

Вы можете создать каталог app/modules и создать в нем модуль XYZUtils, например,

module XYZUtils
  def abc
  end

  def efg
  end
end

и включите модуль, как и когда требуется в контроллерах или моделях и т. Д.

include XYZUtils

Вы можете создавать различные модули для функций утилит, связанных с различными моделями или объектами

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

Я бы держал весь код, связанный с приложением, в самой директории /app

9 голосов
/ 28 апреля 2010

Создать файл модуля в каталоге lib:

module ControllerUtil
  def foo
  end

  def bar
  end
end

Включите модуль в контроллер:

class UsersController < ApplicationController
  include ControllerUtil
end
1 голос
/ 16 ноября 2017

Относительно вышеприведенного ответа Сахил Калры за 2014 год:

В Rails теперь есть каталог app/controllers/concerns, куда вы можете поместить модули, заполненные вспомогательными методами, и легко включать или расширять их в своих контроллерах. Я просто скопировал и вставил все мои интенсивные логические методы из моего application_controller, и они работали прямо из коробки.

(Вы, конечно, должны убедиться, что все работает правильно, прежде чем запускать что-либо в производство.)

1 голос
/ 28 апреля 2010

Контроллеры должны быть очень минимальными - в основном принимать внутрь аргументы и принимать решения очень высокого уровня. Если у вас есть какие-то вспомогательные функции, которые выполняют подобные вещи, но не будут использоваться повторно, то сохранение их в контроллере - правильное решение. Просто пометьте их как частные.

Для более распространенных вещей вы можете либо вернуть их обратно в свой ApplicationController (если они используются во всех контроллерах), либо в класс в каталоге app / models. Я рекомендую каталог моделей через lib, потому что Rails в режиме разработки гораздо лучше обнаруживает изменения в этих файлах и перезагружает их. Изменения в файлах в / lib, как правило, требуют перезапуска веб-сервера, что замедляет ваши усилия по разработке. Это прискорбно, потому что помощники контроллера не должны смешиваться с моделями.

В общем, хотя, если у вас есть несколько таких помощников, вы, вероятно, слишком много делаете в своих контроллерах. Внимательно посмотрите на них и посмотрите, не могут ли некоторые из них быть частью ваших моделей.

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