Доступ к основным помощникам приложения при переопределении вида / структуры Rails Engine - PullRequest
23 голосов
/ 10 февраля 2012

Я создал простой Rails Engine для предоставления некоторой общей функциональности (фотогалерея) приложению.Я хочу иметь возможность переопределить стандартный партиал _header, чтобы меню галереи соответствовало меню моего основного приложения.В моем представлении заголовка я вызываю помощника, который является частью application_helpers (основное приложение), но я продолжаю получать ошибки «неопределенный метод».Из того, что я могу сказать, основное приложение application_helpers не включается (очевидно), когда я переопределяю макет приложения движков или его части.

Итак, мой вопрос: как переопределить представление движка в основном приложении и получить доступ к основным методам приложения?Мне все еще нужен был бы доступ к помощникам двигателя, а также чтобы не испортить функционал двигателя.

Нужно ли также переопределять контроллеры?Похоже, очень много, только чтобы получить несколько помощников.

Спасибо

Rails 3.1.3

Ответы [ 5 ]

3 голосов
/ 18 октября 2013

ознакомьтесь с этой записью в блоге: http://www.candland.net/2012/04/17/rails-routes-used-in-an-isolated-engine/ Автор добавляет определение method_missing к помощнику приложения, чтобы получить доступ к помощникам родительского приложения.*

module Blogit
    module ApplicationHelper
      def method_missing method, *args, &block
        puts "LOOKING FOR ROUTES #{method}"
        if method.to_s.end_with?('_path') or method.to_s.end_with?('_url')
          if main_app.respond_to?(method)
            main_app.send(method, *args)
          else
            super
          end
        else
          super
        end
      end

      def respond_to?(method)
        if method.to_s.end_with?('_path') or method.to_s.end_with?('_url')
          if main_app.respond_to?(method)
            true
          else
            super
          end
        else
          super
        end
      end
    end
  end
2 голосов
/ 12 сентября 2012

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

class MyEngineClass
  include ApplicationHelper

  #...
end

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

После включения ApplicationHelper вы сможете напрямую использовать эти помощники в контроллере.

Похоже, что вы также можете вызвать ClassName.helper("application") для многих классов Rails - не уверен, будет ли это работать здесь.

1 голос
/ 03 октября 2012

Двигатели должны быть независимы от основного приложения, поэтому вы не можете получить доступ к его помощникам из Engine.

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

# In the main app
# initializers/share_helpers_path_with_engine.rb
PhotoGallery::Engine.class_eval do
  paths["app/helpers"] << File.join(File.dirname(__FILE__), '../..', 'app/helpers')
end

Вам, конечно, нужно изменить PhotoGallery на фактическое имя вашего класса двигателя.

Не стесняйтесь просматривать документацию по двигателям(раздел о путях): http://edgeapi.rubyonrails.org/classes/Rails/Engine.html

1 голос
/ 14 марта 2012

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

Я нашел это обсуждение особенно проницательным.Есть также некоторые интересные идеи в Rails Engine API документах под Изолированные помощники движков .

0 голосов
/ 01 октября 2012

Отказ от ответственности: я использовал это решение только в движках Rails 3.2.

Если в вашем движке у вас есть стандартный частичный заголовок vendor / gems / my_gallery_engine / app / views / application / _header.html.erb .

Затем переопределите его в своем главном приложении, создав настраиваемый частичный app / views / application / _header.html.erb .

Переопределение работает, потому что путь поиска по шаблону представления Rails (по умолчанию) начинается с каталога app / views основного приложения, а затем выполняет поиск по app / views в движках порядок загрузки.

Все помощники вашего основного приложения будут доступны в частичном.

...