Переопределить действие контроллера Rails Engine - PullRequest
14 голосов
/ 21 мая 2010

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

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

Ответы [ 2 ]

19 голосов
/ 21 мая 2010

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

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

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

9 голосов
/ 29 апреля 2017

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

# 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 и добавляю к нему аутентификацию. Поскольку я использую декларативную авторизацию, которую Blazer не поддерживает напрямую, мне нужно открыть базовый контроллер Blazer и добавить к нему свои требования авторизации.

...