2012-06-29 5 views
6

Я в процессе конвертации своего стандартного приложения Rails в монтируемый двигатель. Приложение сопоставимо со стандартным приложением для блогов, и я хочу, чтобы каждая модель, контроллер и вид расширялись, поэтому мой выбор для монтируемого движка.Rails монтируемый двигатель и переопределение другого двигателя

Один из драгоценных камней, которые я использую, - это Devise, насколько я понимаю, что-то вроде монтируемого двигателя. Его можно использовать внутри монтируемого двигателя, как указано в here.

Я могу использовать его частично в своем двигателе. Все прекрасно работает в том числе некоторые DEViSE контроллера я переопределить как этот:

# config/routes.rb 

Bbronline::Engine.routes.draw do 
    devise_for :users, class_name: "Bbronline::User", module: :devise, 
    controllers: { registrations: "bbronline/devise_overrides/registrations"} 
    ... 

# controllers/bbronline/devise_overrides/registrations_controller.rb 
require_dependency "bbronline/application_controller" 

module Bbronline 

class DeviseOverrides::RegistrationsController < Devise::RegistrationsController 

    def new_intermediair 
    @user = User.new 
    end 
    ... 

правильное мнение «вид/bbronline/devise_overrides/регистрация/new_intermediair.html.haml» также загружаются правильно, как и ожидалось.

Однако моя проблема заключается в том, что представления, которые я переопределяю без специального контроллера, загружены неправильно. Например, представление, которое должно иметь вид входа в систему, находится в views/bbronline/devise/sessions/new.html.haml и не загружено. Вместо этого загружается стандартное представление входа в Devise, то есть devise-2.1.0/app/views/devise/sessions/new.html.erb

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

ответ

4

Адрес: Введенный код не задан. Проверка просмотра пути DEViSE :: SessionsController показывает:

Devise::SessionsController.view_paths 
=> #<ActionView::PathSet:0x007fa1bf0e36f8 @paths= [/Users/harmdewit/Dropbox/Code/projects/brightin/bbr-online/bbr-online-gem/test/‌​dummy/app/views, 
/Users/harmdewit/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/devise-2.1.‌​0/app/views, 
/Users/harmdewit/Dropbox/Code/projects/brightin/bbr-online/bbr-online-gem/app/vi‌​ews]> 

Последний путь монтируемого двигателя должен находиться перед срединным путем изобрести. Решение устанавливает приоритет загрузки в application.rb так:

#test/dummy/config/application.rb (the app that uses my mountable engine) 
... 
config.railties_order = [Blog::Engine, :main_app, :all] 
... 

Это также задокументировано в апи рельсов: http://api.rubyonrails.org/classes/Rails/Engine.html#label-Loading+priority

Благодаря Хосе Valim для указания в правильном направлении.

+2

В любом случае, я мог бы внести это изменение без изменения конфигурации моего фиктивного приложения? Я бы предпочел сделать это по умолчанию, когда я загружаю свой драгоценный камень. – Ajedi32

1

Мне нужна дополнительная информация. Какой контроллер вы определяете и от какого контроллера он наследуется? Какой вид просматривается и какой из них вы ожидали отдать? Кроме того, .view_paths ваш друг так попробовать в ваших рельсам консоли следующее:

Devise::SessionsController.view_paths 
YourApp::SomeDeviseController.view_paths 

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

+0

Я не определяю контроллер, я просто хочу переопределить представление. Более конкретно, я хочу переопределить представление, находящееся в 'devise-2.1.0/app/views/devise/sessions/new.html.erb', без переопределения контроллера. Это возможно? –

+0

Oh. Просмотры страниц: Разработка: SessionController.view_paths => # Bbronline :: SessionsController не существует, конечно, я не переопределяю его. –

+1

Если вы не хотите использовать пользовательский контроллер, просто переопределите просто разместите свое новое представление по адресу: 'your-engine/app/views/devise/sessions/new.html.erb' и убедитесь, что движок Devise загружен перед вашим монтируемым движком (просто нужно разработать ранее). Опять же, вызов '.view_paths' в вашем' Devise.parent_controller' или в вашем контроллере приложения скажет вам порядок поиска шаблона. –

7

Если вы не хотите, чтобы настроить config.railties_order в каждом приложении, которое использует двигатель, только require 'devise' на верхней части Lib \ my_engine \ engine.rb файл .

+1

Yay, это сработало! +1 – Ajedi32

+1

В то время как другие ответы дают представление о просмотре view_paths, это ответ, если ваш движок предназначен для загрузки и настройки других двигателей. – prusswan

+0

спас мою жизнь = D –