Метод 1
Вот что я вставил в свое приложение Rails 3 в application.rb
после require 'rails/all'
(дайте мне знать, если это плохое место, чтобы поставить его)
require 'active_support/dependencies'
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.to_s + '/app')
relative_name = file_name.gsub(Rails.root.to_s, '')
#@engine_paths ||= Rails::Application.railties.engines.collect{|engine| engine.config.root.to_s }
#EDIT: above line gives deprecation notice in Rails 3 (although it works in Rails 2), causing error in test env. Change to:
@engine_paths ||= YourAppName::Application.railties.engines.collect{|engine| engine.config.root.to_s }
@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
Некоторое время это не сработало, вызывая
TypeError in PostsController#index
superclass mismatch for class PostsController
, но это было связано с опечаткой определения класса class PostsController < ActionController::Base
, которая должна быть class PostsController < ApplicationController
Метод 2
Если вы не хотите делать это для всех контроллеров двигателя и т. Д., Вы можете загрузить контроллер двигателя до определения в главном приложении
require PostsEngine::Engine.config.root + 'app' + 'controllers' + 'posts_controller'
class PostsController < ApplicationController
# extended methods
end