рельсы prepend_view_path монтируемого двигателя - PullRequest
3 голосов
/ 19 марта 2012

В одной руке у меня есть монтируемый движок, скажем, Front Front содержит мои ресурсы и пару страниц, которые изолированы от MainApp.Я не хочу, чтобы оно касалось основного приложения.

С другой стороны, я хочу, чтобы мое MainApp использовало макет и часть Front.Поэтому я настроил макет следующим образом:

class ApplicationController < ActionController::Base
    layout 'front/application'
end

Но фронт / приложение относятся к частичной части двигателя напрямую, из-за изоляции, как это

render 'header' # front/ prefix is not required

Таким образом, представления MainApp пытаются загрузитьapp / views / application / header вместо app / views / front / application / header

Чтобы исправить это, я поставил prepend_view_path так:

class ApplicationController < ActionController::Base
    layout 'front/application'
    before_filter :prepend_front
protected
    def prepend_front
       prepend_view_path "app/views/front"
    end
end

Но это не работает, потому чтопуть двигателя указывает на поставщика.Движок сам добавит это в список предустановленных путей: ~ / main_app / vendor / private_gems / front-0.0.2 / app / views И мой метод preprend_front создаст это: ~ / main_app / app / views / front

Я попытался принудительно вставить правильный путь (но он выглядит таким грязным):

prepend_view_path "#{Rails.root}/vendor/private_gems/front-0.0.2/app/views/front"

У меня не работает, просто вылетает приложение ...

И язастрял здесь.Может быть, мой дизайн не так?

Ответы [ 3 ]

2 голосов
/ 28 октября 2014

Ответ от Джека идеален, за исключением случаев, когда вы хотите сделать это внутри движка Rails (например, если у вашего движка есть «темы», требующие другого пути загрузки). В этом случае prepend_path и append_path не подходят, так как вы хотите вставить ваш новый путь загрузки до пути загрузки двигателей по умолчанию, но после пути загрузки приложений.

Решение этой проблемы (проверено только в Rails 3.2) заключается в добавлении следующего к вашему файлу engine /lib/my_engine.rb:

config.after_initialize do
  my_engine_root = MyEngine::Engine.root.to_s
  paths = ActionController::Base.view_paths.collect{|p| p.to_s}
  paths = paths.insert(paths.index(my_engine_root + '/app/views'), my_engine_root + '/app/views/themes/my_theme')
  ActionController::Base.view_paths = paths
end

Новый путь загрузки my_engine_root + '/app/views/themes/my_theme' теперь будет перед стандартной загрузкой вашего двигателя my_engine_root + '/app/views'

1 голос
/ 10 января 2014

По умолчанию Rails ищет в представлениях / файл, но когда он не находит его, он просматривает представления движка /.Это означает, что вам придется добавить путь к представлениям, чтобы Rails просматривал представления основного приложения /, а затем измененный путь в вашем движке и, наконец, представления движка /.Тогда это будет стек:

  • основные виды приложения /
  • модифицированный путь двигателя (виды / передний / внутренний двигатель)
  • виды двигателя /

Чтобы сделать это, перейдите в application_controller.rb

class ApplicationController < ActionController::Base

    before_filter :set_views_path

    def set_views_path
        append_view_path FnetIdentityRailsEngine::Engine.root.join('app', 'views', 'front')
    end
end

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

0 голосов
/ 20 марта 2012

Наконец я удаляю свойство isolate. Я переместил свои представления на одну папку вверх, поэтому из папок engine_app.

Единственным последним исправлением было включение EngineApp :: Engine.url_helper в контроллер приложения MainApp.

Стек prepend выглядит следующим образом:

  • Путь к основному приложению
  • Основные виды приложений
  • Вид двигателя

Так что это основано на движке, затем добавьте основной материал приложения сверху.

...