Я вижу два варианта достижения вашей цели.
Первый подход: объявите оба фильтра внутри ApplicationController
и внутри фильтра и проверьте, совпадают ли controller_name
и action_name
с любым в вашей yaml-конфигурации. Если они совпадают, выполнить его, если не игнорировать.
В коде, который хотел бы
class ApplicationController
before_filter :start_action_with_check
after_filter :end_action_with_check
def start_action_with_check
c_name, a_name = CONFIG['track1']['start_action'].split(', ')
if c_name == controller_name && a_name == action_name
do_start_action
end
end
...
Надеюсь, вы поняли идею.
Второй подход: простой способ определить before_filter
- определить их в модуле. Обычно вы используете метод self.included
для определения before_filter
, но, конечно, вы можете определить их условно. Например:
class HomeController < ApplicationController
include StartOrEndAction
...
end
и в lib/start_or_end_action.rb
вы пишете
module StartOrEndAction
def self.included(base)
# e.g. for the start-action
c_name, a_name CONFIG['track1']['start_action'].split(', ')
if c_name == controller_name && a_name == action_name
base.before_filter :do_start_action
end
# and do the same for the after_filter
end
def do_start_action
...
end
def do_end_action
...
end
end
Преимущество второго решения заключается в том, что before_filter
и after_filter
определяются только при необходимости. Недостатком является то, что вам придется включать модуль в каждый контроллер, где вы можете настроить предварительный фильтр.
Преимущество первого заключается в том, что любой контроллер покрыт, и вы получаете небольшие накладные расходы, проверяя фильтр до и после.
Надеюсь, это поможет.