У меня есть несколько помощников, определенных во время выполнения, которые характерны для одного вызова, например, для одного экземпляра контроллера (следующий вызов может иметь разные вспомогательные методы).Есть ли надежный способ добавить вспомогательный метод к экземпляру контроллера и только его представление, без добавления помощника к другим экземплярам и представлениям этого контроллера?
Чтобы определить помощникдля ВСЕХ экземпляров вы можете использовать метод .helper_method
, например
class Article < ApplicationController
helper_method :my_helper
def my_helper
# do something
end
end
Я покопался в исходном коде и нашел (довольно приватный) метод #_helpers
, который возвращает модуль, содержащий всепомощники для этого экземпляра.Теперь я могу использовать метапрограммирование для определения своих методов в этом модуле
def index
_helpers.define_singleton_method(:my_helper) do
# do something
end
end
Но мне не нравится этот подход, потому что я использую явно закрытый метод, который может легко измениться в будущем (см.ведущий _
).
Если бы мне был нужен только помощник внутри экземпляра контроллера, я мог бы просто вызвать #define_singleton_method
непосредственно на экземпляре, но это не делает его доступным для представления.
Итак, я ищу официальный «путь Rails» для определения помощника для отдельного экземпляра контроллера и его представления, как в Rails есть метод класса .helper_method
.