Переопределить действие контроллера Rails Engine

Я использую механизм Rails, но мне нужно настроить некоторые действия контроллеров.

Я действительно исказил движок и внедрял эти настройки в свою собственную вилку, но мне было интересно, есть ли официальный способ в Rails Engines переопределить и настроить контроллеры.

Ответы

Ответ 1

Просто определите контроллер с тем же именем в вашей собственной папке app\controllers, и он будет найден первым. Таким образом вы можете легко настроить его.

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

Примеры можно найти здесь: http://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers

Ответ 2

Ссылка в принятом ответе фактически не представляет собой пример переопределения контроллера. Они упоминают "открытый класс" файла, но не объясняют, как именно это сделать. Если вы откроете класс двигателя в своем приложении, вы получите ошибку циклической зависимости, потому что вы ссылаетесь на/открываете класс, который в настоящее время находится в процессе определения. Поэтому вам нужно сначала убедиться, что вы загружаете фактический класс двигателя.

# in my app
# app/controllers/blazer/base_controller.rb
load Blazer::Engine.root.join('app/controllers/blazer/base_controller.rb')
Blazer::BaseController.class_eval do
  filter_access_to :all
end  

В моем случае я использую Blazer gem и добавляя к нему аутентификацию. Поскольку я использую декларативное разрешение, которое Blazer не поддерживает напрямую, мне нужно открыть базовый контроллер Blazer и добавить к нему мое требование авторизации.