Запуск перед фильтром в плагине.Есть ли другой путь? - PullRequest
0 голосов
/ 25 мая 2011

Я пишу свой первый плагин, и в этом плагине мне нужно запустить метод для некоторых пар контроллер / действие.Для этого плагина конфигурация yml выглядит следующим образом -

track1:
   start_action: "home", "index"
   end_action: "user", "create"

Итак, в моем плагине я сначала прочитаю выше файл yml.После этого я хочу запустить действие скажем - first_function as before_filter для index-action домашнего контроллера, и я буду запускать second_function as after_filter для create-action пользовательского контроллера.

Но я не мог понять, какмогу ли я написать фильтры для этого, которые будут объявлены в плагине и будут выполняться для действий, указанных пользователем в вышеупомянутых файлах yml.

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 26 мая 2011

Я вижу два варианта достижения вашей цели.

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

Надеюсь, это поможет.

...