Добавить помощника только к экземпляру контроллера rails - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть несколько помощников, определенных во время выполнения, которые характерны для одного вызова, например, для одного экземпляра контроллера (следующий вызов может иметь разные вспомогательные методы).Есть ли надежный способ добавить вспомогательный метод к экземпляру контроллера и только его представление, без добавления помощника к другим экземплярам и представлениям этого контроллера?

Чтобы определить помощникдля ВСЕХ экземпляров вы можете использовать метод .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.

1 Ответ

0 голосов
/ 27 сентября 2019

Я не уверен, если есть официальный Rails способ сделать это.

1002 * Вы можете создать анонимный модуль и простираться от этого.Поскольку в этом решении используется чистый Ruby, вам придется расширить и контроллер, и представление.
before_action :set_helpers, only: :index

def index
  # ...
end

private

def set_helpers
  @helpers = Module.new do |mod|
    define_method(:my_helper) do
      # do something
    end
  end

  extend(@helpers)
end
<% extend(@helpers) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...