Механизмы направляющих, расширяющие функциональность

У меня есть механизм, который определяет некоторые модели и контроллеры. Я хочу смочь расширить функциональность некоторых моделей/контроллеров в моем приложении (например, добавляющие методы), не освобождая исходную функциональность модели/контроллера от механизма. Везде я считал, что просто необходимо определить контроллер с тем же именем в приложении, и направляющие автоматически объединят их, однако это не работает на меня, и контроллер в механизме просто проигнорирован (я не думаю, что это даже загружается).

15
задан tshepang 16 October 2013 в 09:17
поделиться

3 ответа

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

module ActiveSupport::Dependencies
  alias_method :require_or_load_without_multiple, :require_or_load
  def require_or_load(file_name, const_path = nil)
    if file_name.starts_with?(RAILS_ROOT + '/app')
      relative_name = file_name.gsub(RAILS_ROOT, '')
      @engine_paths ||= Rails::Initializer.new(Rails.configuration).plugin_loader.engines.collect {|plugin| plugin.directory }
      @engine_paths.each do |path|
        engine_file = File.join(path, relative_name)
        require_or_load_without_multiple(engine_file, const_path) if File.file?(engine_file)
      end
    end
    require_or_load_without_multiple(file_name, const_path)
  end
end

Это автоматически потребует файлы от движка, прежде чем запрос от приложения, если путь к файлу начинается с app.

2
ответ дан 1 December 2019 в 02:09
поделиться

Это правда. Будет использован контроллер, который будет найден первым.

Чтобы заставить его работать, у вас может быть два варианта:

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

Надеюсь, это поможет.

1
ответ дан 1 December 2019 в 02:09
поделиться

Я никогда раньше не использовал Engines, но разве вы не можете определить новый контроллер, который наследуется от контроллера, предоставляемого движком

0
ответ дан 1 December 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: