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

Где использовать многоразовые методы доступа контроллерами в рельсах

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

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

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

4b9b3361

Ответ 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 требуют перезапуска веб-сервера, что замедляет ваши усилия по разработке. Это несчастливо, потому что помощники контроллера не должны смешиваться с моделями.

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