Где использовать многоразовые методы доступа контроллерами в рельсах
У меня есть несколько методов, которые я вызываю из своих контроллеров, которые чувствуют, что их нужно вытащить и ввести в класс повторно, вне контроллера. Где люди обычно кладут этот материал? Я знаю, что могу поместить их в свой ApplicationController, но это не кажется отличным решением, если я думаю, что смогу использовать эти методы позже в других приложениях.
Кроме того, у меня есть куча полезных методов в моих контроллерах, которые, вероятно, не будут использоваться в других контроллерах или в будущем вообще, но я чувствую, что они просто раздувают мой контроллер. Люди обычно перемещают их куда-нибудь для чистоты или просто заканчивают огромным контроллером?
Я прихожу из Java и Actionscript, где я просто создаю новые классы использования для этого материала.
Ответы
Ответ 1
Каталог lib - это место, где вы можете поместить модули/классы, которые могут быть смешаны или использованы контроллерами (и что-то еще, действительно). Это может быть место для размещения кода, который не попадает в другие области (но будьте осторожны, чтобы убедиться, что lib не превращается в беспорядок). Боковые комментарии просто иметь в виду:
-
Если вы знаете, что у вас есть большое количество связанных функций, которые могут или будут использоваться в других приложениях, это может быть плагин.
-
Также стоит иметь в виду, что нет ничего плохого в создании модели, которая не является объектом Active Record. Так что, опять же, в зависимости от того, что у вас есть, это может иметь смысл.
Ответ 2
Вы можете создать каталог app/modules
и создать в нем модуль XYZUtils, например
module XYZUtils
def abc
end
def efg
end
end
и включать модуль по мере необходимости в контроллерах или моделях и т.д.
include XYZUtils
Вы можете создавать различные модули для функций утилиты, связанных с различными моделями или сущностями.
Я не буду использовать каталог /lib
, потому что он должен содержать код, связанный с проектом, а не связанный с ним, например задачи и т.д.
Я бы сохранил весь код, связанный с приложением, в самой директории /app
Ответ 3
Создайте файл модуля в каталоге lib
:
module ControllerUtil
def foo
end
def bar
end
end
Включите модуль в контроллер:
class UsersController < ApplicationController
include ControllerUtil
end
Ответ 4
Относительно Сахил-калры выше ответа от 2014 года:
В Rails теперь есть каталог app/controllers/concerns
, где вы можете поместить модули, полные вспомогательных методов, и легко включать или расширять их в своих контроллерах. Я только что скопировал и вложил все мои логически интенсивные методы из моего приложения_controller, и они работали прямо из коробки.
(Вы должны, конечно, все равно убедиться, что все работает правильно, прежде чем вносить что-либо в производство.)
Ответ 5
Контроллеры должны быть очень минимальными - в основном проглатывание аргументов и принятие решений очень высокого уровня. Если у вас есть вспомогательные функции, которые выполняют только такие вещи, но не будут использоваться повторно, то правильное решение будет держать их в контроллере. Просто убедитесь, что они отмечены как частные.
Для более общих вещей вы можете либо вернуть их в свой ApplicationController (если они используются во всех контроллерах), либо в класс в вашем каталоге приложений/моделей. Я рекомендую каталог моделей через lib, потому что Rails в режиме разработки намного лучше обнаруживает изменения этих файлов и перезагружает их. Изменения в файлах в /lib требуют перезапуска веб-сервера, что замедляет ваши усилия по разработке. Это несчастливо, потому что помощники контроллера не должны смешиваться с моделями.
В общем, хотя, если у вас есть несколько горсти этих помощников, вы, вероятно, слишком много делаете в своих контроллерах. Взгляните на них и посмотрите, не может ли кто-то из них не быть частью ваших моделей.