在插件中过滤之前运行。还有其他方法吗?

时间:2011-05-25 12:38:41

标签: ruby-on-rails ruby-on-rails-3 rubygems ruby-on-rails-plugins

我正在编写我的第一个插件,在该插件中,我需要为某些控制器/操作对运行一个方法。对于这个插件,配置yml看起来像这样 -

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

所以,在我的插件中,我将首先阅读上面的yml文件。之后我想运行一个动作说 - first_function as before_filter到home-controller index-action,我将运行second_function作为after_filter进行用户控制器create-action。

但是我无法弄清楚如何为此编写过滤器,这些过滤器将在插件中声明,并将运行用户在上述yml文件中指定的操作。

请帮忙!

1 个答案:

答案 0 :(得分:0)

我认为有两种选择可以实现目标。

第一种方法:声明ApplicationController内和过滤器内的过滤器,检查{yaml-configuration中的controller_nameaction_name是否匹配。如果匹配,则执行它,如果不是忽略。

在想要

的代码中
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_filterafter_filter仅在需要时定义。缺点是您必须将模块包含在每个控制器中,您可以在其中配置前置过滤器。 第一个优点是任何控制器都被覆盖,并且在检查前后过滤器时会有一点开销。

希望这有帮助。