2010-05-21 3 views
13

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

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

+0

Посмотрите там http://stackoverflow.com/questions/5045068/extending-controllers-of-a-rails-3-engine-in-the-main-app – Andrei

ответ

18

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

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

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

+0

Намного проще, чем использовать обычную вилку! Спасибо и извините за хромой вопрос! –

+0

Это будет отменять весь контроллер, а не только одно действие. –

+0

Я не требовал обратного. Но, по крайней мере, вы можете настроить его. У вас есть лучшее решение? – nathanvda

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

+1

Это должен быть принятый ответ, поскольку он дает пример того, что ОП запрашивал, а также использует формат, который предлагают документы в руководстве по направляющим. – dft